【发布时间】:2014-07-30 21:15:33
【问题描述】:
假设您有模块 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__? This topic's answer 提供了一种通过 __main__ 中的代码检测它的方法,但我希望模块自己检测它。这有可能吗?
【问题讨论】:
-
“当然,在
__main__中从foo中的值复制”是什么意思?事实并非如此。 -
@BrenBarn 如果通过
from foo import *导入模块,第一次从模块中读取变量时,它的值会直接复制到__main__ 中,从而更新为foo中的值 won'在 __main__ 中不可见,我的主要问题是什么,因为这不能通过使用global bar和线程中的“正常”分配来解决...... -
不复制该值。新的 name 绑定到相同的值。你可以在 StackOverflow 上找到很多关于这种差异的问题。如果您的模块要求其用户“观察”变量的更改,只需记录并告诉用户不要使用
from foo import *(尽管这是一个脆弱的设计,最好避免使用)。无论如何,最好问一个关于你实际想要完成的问题,而不是你认为可以帮助你完成它的特定技术(因为它可能不会)。