Python静态变量

时间:2011-11-24 06:43:43

标签: python python-3.x static-variables

我正在创建一个使用基类来保存所有配置值,导入方法等的应用程序。

/
  - 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

1 个答案:

答案 0 :(得分:4)

我会根据我认为你的问题与asgard一起工作,因为你的简化例子已被打破:

  1. 由于循环导入,您无法运行main.py,但我认为您打算main.py正在运行(正在运行otherfile.py不会出现我相信您的问题'遇到了。)。
  2. 您实际上从未向Main.config分配任何内容。我不确定你打算分配给它的确切位置。
  3. 无论如何,到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.pyasgard.py只会导入名称为asgard的{​​{1}}。另一个可行的解决方案是if __name__ == '__main__': sys.modules['asgard'] = sys.modules['__main__']

    请, 永远不会拉出if __name__ == '__main__': import ...技巧。这意味着,如果您尝试import asgard; asgard.Asgard.initialize(),例如,它将无法说明名称'os'未定义。请将这些导入放在文件的顶部,它们属于它们。