【发布时间】:2020-01-20 21:37:03
【问题描述】:
我在 spyder 中重新运行脚本时遇到了问题,该脚本会动态地将自己的一些属性制成表格。
这是一个代表我正在做的事情的最小示例。我有一个使用正常运行 (F5) 命令运行的源脚本。它在它所在的同一目录中运行:
runfile('C:/some/path/test.py', wdir='C:/some/path')
test.py
import sys
def x():
pass
def y():
pass
x.add = y.add = True
if __name__ == '__main__':
a = [obj for obj in tuple(sys.modules[__name__].__dict__.values())
if getattr(obj, 'add', False)]
print(a)
我可以重新运行这个脚本几次,并且总是得到相同的预期结果:
[<function x at 0x0000025E793DBD90>, <function y at 0x0000025E793DB598>]
我希望如果我更改其中一个函数的名称,例如从 x 更改为 f,并将属性分配给 f.add = y.add = True,我会得到相同的结果,但 x 已更改到f。相反,我得到了
[<function x at 0x0000025E793DB510>, <function y at 0x0000025E793DBBF8>, <function f at 0x0000025E793DBA60>]
鉴于新函数f 出现在列表中,但旧的x 仍然存在,我认为脚本的模块缓存没有被正确清除。
我一直在使用控制台上的橡皮擦按钮手动清除工作区,但我觉得必须有更好的解决方案,或者至少解释正在发生的事情。也许是 UMR 的问题?
我正在运行带有以下内容的 Spyder 3.3.3:Python 3.7.3 64 位 | Qt 5.9.6 | PyQt5 5.9.2 | Windows 10,IPython 7.4.9
【问题讨论】:
-
沿着these lines我期待
-
Spyder 缓存变量和结果而不清除它们。这不是偶然的。有一种解决方法:here
-
它有一些很酷的用途。您可以运行一个需要 10 分钟的函数来处理数据并将其返回为全局名称,然后只需为每次后续运行调用该函数进行哈希处理,而不必再次产生处理时间(直到您擦除命名空间,也就是说) .不过,除非你知道这个名字会无限期地流传下去,否则你很有可能会被它咬住
-
@MyNameIsCaleb。我会接受这个和 roganjosh 的评论/GitHub 线程相结合的答案
-
我链接到的答案确实指向了与 Caleb 给出的相同解决方案,但由于我不太在意将其充实到答案中并且您已经邀请他们给出答案,所以我会在我回答之前给他们机会把一个放在一起:)