整整半天 一直在 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