Python str.translate 字符映射:一次替换成两个字,为什么不会继续套下一条规则 整理外部导出的标签时,常需要把全角冒号换成半角,把某个装饰符删除,再把一个缩写符号展开成两个字符。连续调用 replace 很快能写出来,但规则一多,前一步产生的新字符可能又被后一步改掉。若需求是“按原字符各处理一次... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python enumerate 的起始编号:标签从十开始,为什么第一条数据仍没有跳过 导入一份带表头的名单,想让第一条数据标成第二行,于是写 enumerate(rows, start=2)。结果表头仍然被处理,只是贴上了编号二。另一个常见问题是把分页起始编号设成十一,随后拿这个编号访问只有三项的当前... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python scandir 元数据缓存:文件已经变大,旧 DirEntry 为什么仍报原来的大小 扫描目录后把 DirEntry 对象存进列表,过一会儿再用它们统计大小,结果可能一直停在旧数字。文件确实已经被写大,目录项也不是没找对;关键在于 DirEntry 会缓存取得的部分元数据,重复调用它的方法不等于每次重... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python 标准输出缓冲:已经 print 了一行,重定向文件为什么还看不见 脚本在终端逐行显示进度,重定向到文件后却很久没有新内容,结束时才一起出现。先确认程序有没有走到 print,再检查标准输出的缓冲方式。正常交互终端通常采用行缓冲,重定向到普通文件时通常采用块缓冲,换行未必立即送出去。... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python timeit 的回收开关:外面已启用 GC,计时里面为什么仍然关闭 一段会产生循环引用的处理函数,在普通脚本里运行正常,换成 timeit 后却观察到不同的对象存活情况。先别急着解释成计时更快或内存泄漏。timeit 默认会在计时期间暂时关闭自动垃圾回收,测试环境已经和原来的运行条件... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python Decimal 信号标记:后一笔计算精确,Inexact 为什么仍为真 批量处理测量值时,程序算完每一行就检查 Inexact,给发生精度损失的记录打标。第一行除不尽,第二行明明得到精确的零点五,却也被判为不精确。问题可能出在诊断状态没有清零:Decimal 的信号标记会保留此前发生过的... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python ConfigParser 键名:Path 和 path 为什么会被判成同一个配置项 一份工具配置同时出现 Path 和 path,开发者认为它们是两个名字,ConfigParser 却报告重复选项;只保留一个再写回,首字母又变成小写。这不是写文件时随机改了拼写,而是选项名称在进入解析器时就经过了归一... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python 包资源读取:模块能从 ZIP 导入,旁边的模板为什么不能当普通路径打开 开发目录里,按模块的 __file__ 拼出模板路径一直可用;把包放进 ZIP 后,模块仍能导入,模板却打不开。原因是导入系统能够理解归档内部位置,而普通文件系统接口未必理解。资源属于包,并不保证它已经是一份可直接打... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python SequenceMatcher:两段重复文字很像,相似度为什么却接近零 比较两段长文本,只有开头一个字符不同,其余都是同一字符,直觉上应该非常相似。SequenceMatcher 默认给出的分数却可能为零。遇到这种结果,先查看匹配器的高频元素启发式,再怀疑文件内容或字符编码;输入长度与重... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python mock.side_effect:响应列表用完后,为什么不会退回默认返回值 测试一个会重试的读取函数,给替身安排四次响应,同时设置默认返回值。原以为第五次会继续返回默认值,测试却出现 StopIteration。这里的响应列表有自己的消费状态;列表耗尽不会自动切换到另一项配置,多调用一次本身... yunqueblog/ 技术教程/ 2026-10-02/ 4 阅读