SQLite hex 的整数参数:255 为什么变成 323535,而不是 FF 把数据库里的整数 255 交给 hex,希望得到 FF,结果却多出六个字符 323535。函数没有把整数算错,而是在处理另一种表示:数字先变成十进制文字,随后编码这些文字的字节。下面分别传入 Python 整数、字符... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
SQLite 文本里的 NUL:长度只报二,为什么后面的字符仍然存在 导入一段编号后,SQLite 的 length 只返回二,应用重新读取却拿到五个字符。若立刻把问题归为驱动截断,就会查错方向。文本中间的 NUL,也就是 U+0000,会让 length 在那里停止计数,但后面的内容... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python gzip 串接成员:两段压缩数据放在一起,为什么一种解压只拿到前半段 两段日志各自压缩后直接串接,gzip.decompress 可以还原两段文本;换成 zlib.decompress 并指定 gzip 格式,却只得到第一段。输入未必损坏:gzip 文件可以包含多个连续成员,而一次 z... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python ast.parse 的检查边界:已经生成语法树,为什么 compile 仍说 return 不能放在这里 一个代码预检工具调用 ast.parse,没有异常便显示“可以运行”。用户交来的单独一行 return 7 却在后面失败:解析器能识别 return 语句的形状,编译器还要检查它是否位于允许的位置。拿到语法树,只通过... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python ConfigParser 备用值:节里没有写 timeout,为什么 fallback 仍然没有生效 给读取配置的代码加上 fallback=5,本想让没有填写超时的任务使用五秒,结果却得到三十秒。原因可能是 DEFAULT 节已经提供 timeout。对 ConfigParser 来说,继承来的值也是能找到的值,只... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python cached_property 缓存失效:输入已经改了,属性为什么仍然返回旧结果 一个报价对象把总量做成 cached_property,第一次读取很快得到结果。后来往原始列表追加一项,再读总量却没有变化。装饰器保存的是第一次计算的结果,并没有为输入列表安装变化监听。下面用 calls 记录计算次... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python assertLogs 捕获阈值:代码写了日志,为什么退出 with 时测试仍失败 测试给一段处理流程加上 assertLogs,设置最低级别为 WARNING。流程确实调用了 logger.info,退出 with 时却报告没有捕获日志。这里需要验证的是“指定来源中至少有一条记录达到阈值”,不是“... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python sched 取消事件:从队列移除了任务,为什么再次 cancel 会报错 程序保存了定时事件,用户取消后从队列移除。清理代码再次取消同一事件,却收到 ValueError。sched.cancel 的契约是移除仍在队列里的那个事件,不是一个重复调用也永远成功的“保证不存在”操作。已经取消或... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python Barrier 破损状态:第一次等待超时后,为什么下一次 wait 仍立刻失败 两个工作线程约好都完成准备后再进入下一阶段,其中一个没有到达,另一个等到超时。捕获异常之后,程序原地再调用 wait,却马上又失败了。Barrier 的超时会把整个屏障放进破损状态,这个状态会留给后续等待者;单个调用... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
SQLite min 与 max 的参数个数:多写一个值,为什么汇总结果变成了逐行结果 原查询用 max(v) 求整张表的最大值。为了让结果至少为五,维护者顺手改成 max(v, 5),结果接口突然收到三行。这里多出来的实参改变了函数类别:SQLite 的 min 和 max 在只有一个实参时进行聚合,... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读