踩了 getsource 的坑……


整整半天 一直在 debug,一层一层往下排查…… 最后发现问题就在于 getsource() 在 Windows 上有可能即使文件已经改变了但是仍然获得旧的结果……

排查了很久很久,最后发现在写入文件的时候,可能 mtime 的元数据不会那么快更新,或者粒度比较粗,导致修改完代码文件立刻调用 getsource 并不会触发 linecache 重新读取代码文件。也可能是 getsource 的问题

其实并没有把原因完全搞清楚,但已经完全不想管了,毕竟多一事不如少一事,而且人就是这么不求甚解,一旦发现解决问题的办法了,就可能不再追求搞懂它最深层的原因了 唉

不过一方面也是因为 python 标准库完全没有类型标注,代码写的比第三方库烂的多……看了污染眼睛

而且这个 bug 只在 Windows 上出现,而且在 GitHub Actions 上基本上每次都能复现,而我在本机上虽然也是 Windows 但基本上每次都不能复现,所以我 debug 的过程就很恶心:必须不停把更多的东西 print 出来,然后 push 到 GitHub 触发 Action……

解决方案

from linecache import cache

if filepath in cache:
    del cache[filepath]

相关的 commit 历史,简直是 debug 血泪史:Commits · promplate/pyth-on-line