Python combinations 的位置身份:输入只有两种字母,为什么同一对结果会出现两次 从 A、A、B 中取两个元素,combinations 会交出一次 AA 和两次 AB。看到重复 AB 后直接认定库函数没有去重,会漏掉问题本身:两个 A 位于不同位置,可以代表两张独立卡片,也可以代表同一个类别的重... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python range 的长度上限:远处的元素能取到,为什么 len 却抛出溢出异常 程序用 range 表示很大的连续编号空间,创建成功,索引也能取值;加入一行 len 作进度统计,却触发 OverflowError。这并不意味着编号超出了 Python 整数能力,而是序列项数超过了 CPython... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python gzip 串接成员:两段压缩数据放在一起,为什么一种解压只拿到前半段 两段日志各自压缩后直接串接,gzip.decompress 可以还原两段文本;换成 zlib.decompress 并指定 gzip 格式,却只得到第一段。输入未必损坏:gzip 文件可以包含多个连续成员,而一次 z... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python ast.parse 的检查边界:已经生成语法树,为什么 compile 仍说 return 不能放在这里 一个代码预检工具调用 ast.parse,没有异常便显示“可以运行”。用户交来的单独一行 return 7 却在后面失败:解析器能识别 return 语句的形状,编译器还要检查它是否位于允许的位置。拿到语法树,只通过... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python ConfigParser 备用值:节里没有写 timeout,为什么 fallback 仍然没有生效 给读取配置的代码加上 fallback=5,本想让没有填写超时的任务使用五秒,结果却得到三十秒。原因可能是 DEFAULT 节已经提供 timeout。对 ConfigParser 来说,继承来的值也是能找到的值,只... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python cached_property 缓存失效:输入已经改了,属性为什么仍然返回旧结果 一个报价对象把总量做成 cached_property,第一次读取很快得到结果。后来往原始列表追加一项,再读总量却没有变化。装饰器保存的是第一次计算的结果,并没有为输入列表安装变化监听。下面用 calls 记录计算次... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python assertLogs 捕获阈值:代码写了日志,为什么退出 with 时测试仍失败 测试给一段处理流程加上 assertLogs,设置最低级别为 WARNING。流程确实调用了 logger.info,退出 with 时却报告没有捕获日志。这里需要验证的是“指定来源中至少有一条记录达到阈值”,不是“... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python sched 取消事件:从队列移除了任务,为什么再次 cancel 会报错 程序保存了定时事件,用户取消后从队列移除。清理代码再次取消同一事件,却收到 ValueError。sched.cancel 的契约是移除仍在队列里的那个事件,不是一个重复调用也永远成功的“保证不存在”操作。已经取消或... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python Barrier 破损状态:第一次等待超时后,为什么下一次 wait 仍立刻失败 两个工作线程约好都完成准备后再进入下一阶段,其中一个没有到达,另一个等到超时。捕获异常之后,程序原地再调用 wait,却马上又失败了。Barrier 的超时会把整个屏障放进破损状态,这个状态会留给后续等待者;单个调用... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
SQLite OR FAIL 与 ABORT:一条插入报错,前面写进去的行为什么还在 一次多行插入遇到重复编号,应用收到 IntegrityError,便认为这条语句一行也没写入。使用默认的 ABORT 时这个判断通常符合本例,但如果 SQL 明确写了 OR FAIL,失败点之前的成功修改会留下来。只... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读