我正在创建一个使用基类来保存所有配置值,导入方法等的应用程序。
/
- application.py
+ class foo
+ config = None
+ def loadconfig
- otherfile.py
+ class bar
+ def getconfigvalue
所以,如果我启动application.py
并运行loadconfig
,它会将值加载到foo.config
,然后导入(在所述函数内部 - 以绕过循环导入){{1然后创建一个新的otherfile.py
对象,然后尝试从bar
获取配置值,但表示foo.config
等于None。有什么建议吗?
简化代码:
的 main.py
foo.config
otherfile.py
class Main:
config = None
@staticmethod
def start():
## Load the configuration from a file, creating a dict in Main.config ##
Main.other()
@staticmethod
def other():
from otherfile import otherclass
otherclass()
Main.start()
注意:它的安排是这样的,因为它实际上是如何在程序中运行的;我觉得它与范围
有关完整源文件:
asgard.py: http://pastebin.com/jRkWzrPq
library / childcontainer.py: http://pastebin.com/6a561Nun
答案 0 :(得分:4)
我会根据我认为你的问题与asgard一起工作,因为你的简化例子已被打破:
main.py
,但我认为您打算main.py
正在运行(正在运行otherfile.py
不会出现我相信您的问题'遇到了。)。Main.config
分配任何内容。我不确定你打算分配给它的确切位置。无论如何,到asgard.py
。
这里遇到了模块__main__
的问题。当您运行asgard.py
时,其__name__
为__main__
;您可能不知道的是,它实际上是sys.modules
中显示的模块名称 - 主模块是sys.modules['__main__']
,而不是sys.modules['asgard']
。然后,当您导入library.childcontainer
时,它会尝试导入asgard
。这会查找不存在的sys.modules['asgard']
,因此会将asgard.py
的内容导入到新的模块对象中。
如果你有另一个main.py
文件import asgard; asgard.Asgard.initialize()
(忽略我在下面提到的条件导入问题),你就不会遇到这个问题,因为__main__
模块会属于main.py
,asgard.py
只会导入名称为asgard
的{{1}}。另一个可行的解决方案是if __name__ == '__main__': sys.modules['asgard'] = sys.modules['__main__']
。
请,请,请 永远不会拉出if __name__ == '__main__': import ...
技巧。这意味着,如果您尝试import asgard; asgard.Asgard.initialize()
,例如,它将无法说明名称'os'未定义。请将这些导入放在文件的顶部,它们属于它们。