Python WeakKeyDictionary 相等键:后来的对象还活着,为什么条目却跟着原键消失 给文档对象附加临时备注时,可以把对象作为WeakKeyDictionary的键,让备注随对象释放。但如果两个不同对象按业务编号比较相等,向第二个对象写入备注后,删除第一个对象仍可能让条目消失。关键不只是是否使用弱引用... yunqueblog/ 技术教程/ 2026-10-02/ 4 阅读
Python asyncio.shield:内层任务受到保护,为什么外层 await 仍然被取消 一个调用方在等待后台整理任务时被取消,希望后台任务完成手头的小段工作,于是把await换成asyncio.shield。结果调用方仍抛出CancelledError,很容易误以为保护没有生效。此时应分别检查两个任务:... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Bash hash 命令缓存:前面的目录已有新程序,为什么仍然执行旧路径 同名工具明明已经放进PATH前面的目录,当前Bash却仍然启动后面的那份。除了检查别名和函数,还要检查命令路径缓存:Bash可以记住曾经找到的外部命令位置,后续调用不必每次从头搜索所有目录。要稳定复现,不能简单先改一... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
JavaScript Proxy.revocable:外层访问撤销了,先前取出的对象为什么还能修改 给临时编辑会话提供一个可撤销代理,结束时调用 revoke,后续通过代理读写会报错。可是如果调用方早已取出 proxy.nested,保存了里面的普通对象,撤销外层代理并不会让那份引用一起失效。Proxy.revoc... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Node.js pipeline 失败收尾:错误已经捕获,为什么三段流都被销毁了 把读取、转换、写入串成 pipeline 后,最外层捕获到了错误,并不表示内部流仍然适合继续使用。pipeline 会协调这组流的失败收尾。另一个同样重要的事实是:已经送到目标的内容,不会因为整体失败而自动消失。下面... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Node.js process.env 删除变量:赋成 undefined,为什么读到的仍然是字符串 在测试里临时关闭某项配置,把 process.env 的字段赋成 undefined,看起来像是清空变量。可是下一次读取时,它可能仍然存在,内容还是字符串 undefined。环境变量接口的赋值行为,不能直接按普通对... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python HTMLParser 字符引用:关闭自动转换后,为什么属性里的 amp 仍然被解开 写一个HTML检查工具时,设置convert_charrefs=False,通常是希望看到原来的字符引用。不过这个开关不能理解为“所有位置都停止解码”。普通正文、开始标签中的属性值,以及script内容,经过的解析路... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python BufferedReader.peek:只预览一个字节,为什么拿到四个,底层位置也已经前进 检查文件头时,peek(1)看起来像“先看一个字节而不读取”。运行后却拿到一整块内容;更奇怪的是,包装器tell仍为零,底层对象tell已经到了四。这两个结果能够同时成立,因为预览接口面对的是缓冲流,底层填充缓冲区仍... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python Pickler 连续 dump:列表明明已经追加,第二份读取结果为什么仍然是旧内容 把Pickler保存成长期对象,循环里反复调用dump,容易被理解为“每次给当前状态拍一张照片”。但同一个Pickler记得以前见过的对象。再次遇到同一对象时,流中可能写入的是引用,而不是重新遍历并保存它刚刚改变的内... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python surrogateescape 往返:字节不是合法 UTF-8,怎样保留它而不替换成问号 有些工具需要把带有少量非法字节的旧日志读进来,检查能识别的部分,再原样写回。errors="replace"虽然能让读取继续,却已经把出错字节换掉;等到保存时,原来究竟是FF还是另一个字节就无法从替代符号还原了。su... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读