摘要:我有一个脚本公开了(1) a dict
,我需要dict
使用另一个模块对其进行修改
注意:对一个类似问题的两个很好的答案解释了很多关于模块之间变量作用域的信息,但是我不明白这对我的情况如何适用。
在下面的代码,我期望我将能够修改mainmodule.py
变量 container
从内submodule.py
,这是并非如此。为什么?
我应该如何从内部解决mainmodule
实例?container
submodule
主脚本的代码
# mainmodule.py # the main script which ultimately exposes the module variable 'container' import submodule container = dict() class MainClass: def __init__(self): self.sub = submodule.SubClass() def set(self, number): print("main: container was {container}".format(container=container)) container['x'] = number print("main: container is {container}".format(container=container)) def call(self, number): self.sub.set(number) if __name__ == "__main__": mc = MainClass() # updating container from this script mc.set(1) # updating container from another module mc.call(2) # again from this script, to check the updates mc.set(3)
导入模块的代码
# submodule.py import mainmodule class SubClass: def __init__(self): pass def set(self, number): print("sub: container was {container}".format(container=mainmodule.container)) mainmodule.container['x'] = number print("sub: container is {container}".format(container=mainmodule.container))
输出是
main: container was {} main: container is {'x': 1} sub: container was {} sub: container is {'x': 2} main: container was {'x': 1} main: container is {'x': 3}
(1)的实际代码的用途bottle
,以提供container
经由 json.dumps()
盯着你的代码,我想我知道是什么让你失望。作为调用的Python脚本python foo.py
最终会被一个模块(sys.modules
)呼吁__main__
。这意味着您的mainmodule.py
节目的最低位将通过加载,编译和运行一次__name__ == "__main__"
,这会导致某些事情发生。该模块import submodule
,尚未导入,因此可以加载并运行。
submodule
依次尝试导入mainmodule
。尽管该文件之前已执行过,但解释器不知道该模块的名称,因此mainmodule.py
这次再次运行__name__ == "mainmodule"
(与相同"__main__"
,因此if
跳过了底部的套件)。
这意味着您有两个副本container
,一个在名为的模块中__main__
,一个在名为的模块中mainmodule
。两者都来自名为的文件的事实./mainmodule.py
并不重要。
有几种方法可以解决此问题。一种是始终立即导入实数,如:
# mainmodule.py import submodule class Foo: pass if __name__ == "__main__": import mainmodule mainmodule.Foo()
另一个选择是将其中的代码移动if
到另一个文件。