gpt4 book ai didi

python - 更改 sys.modules[__name__] 时找不到时间模块

转载 作者:太空狗 更新时间:2023-10-30 00:44:15 25 4
gpt4 key购买 nike

我将 sys.modules[__name__] 修改为类 Hello,如下所示:

# hello.py
import sys
import time

class Hello:

def print_time(self):
print 'hello, current time is:', time.time()

sys.modules[__name__] = Hello()

然后,我将 hello.py 导入到另一个 python 文件 test.py 中,例如:

# test.py
import hello
hello.print_time()

但是,当我运行 python test.py 时,我得到了一个错误,说 "AttributeError: 'NoneType' object has no attribute 'time'"hello.py 似乎无法导入 time 模块。

我真的没有弄清楚问题。

我该如何解决?

最佳答案

事实证明 NightShadeQueen 是正确的,问题在于原始模块对象正在被垃圾回收——但问题仍然存在,为什么它有这种行为?也就是说,它仍然记录了哪些全局变量曾经存在——引用一些从未导入的东西会给你一个NameError,而所有>did exist 现在是 None。我深入研究了源代码。

模块是一个对象。像许多对象一样,它有一个 __dict__,存储所有没有显式槽的属性。当您创建全局对象时,它们会添加到该字典中。

创建函数时,它会在定义时维护对全局字典的引用。它维护对拥有该字典的模块的引用——它只维护对字典本身的引用。

出于某种原因,模块的终结器清除了它的字典。 (请参阅 the source。)它不是批量删除键,而是将它们全部替换为 None,一条注释解释说它避免了重新散列字典。

坦率地说,我不明白为什么模块终结器需要这样做;它可以合理地删除它对字典的引用,并让字典处理删除对其值的引用。

关于python - 更改 sys.modules[__name__] 时找不到时间模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32282274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com