假设模块foo
包含变量bar
,线程baz
自动更新bar
:
from threading import Thread
import sys
bar = 0
class baz(Thread):
def run(self):
while True:
setattr(sys.modules[__name__], 'bar', getattr(sys.modules[__name__], 'bar')+1);
baz().start()
#Note: Globals is intentionally not used instead of getattr and setattr
因为这个线程的更新在__main__中是不可读的(因为当然在__main__中复制了foo
中的值),是否有可能找出模块是否被from foo import *
或import foo
导入,并根据结果,在setattr和getattr中自动更改__name__为__main__?本主题的答案给出了一种通过__main__中的代码检测它的方法,但我希望模块自己检测它。这有可能吗?
No。一个原因是一个模块可以从许多地方被导入多次。可以在一个地方导入import foo
,在另一个地方导入from foo import *
。在第二次导入时不会"发生"任何事情(将使用sys.modules
中已经导入的模块),因此您的模块无法检测它。