python静态变量和方法

时间:2013-09-23 17:24:58

标签: python static

我知道有几篇关于此的帖子,但我仍然感到困惑。我试图在初始化时使用静态变量,并且不知道如何去做。所以我所拥有的是一个包'config',它有一个模块the_config.py。我想要的是像

这样的东西
# the_config.py

import yaml

user_settings=None

def initialize(user_settings_file)

  with open(user_settings_file) as yaml_handle:
     user_settings = yaml.safe_load(user_settings_file)

然后会有一个调用模块作为pipeline.py

#pipeline.py

import config.the_config as my_config

def main(argv):

    ...
    my_config.intialize(user_settings_file)
    print my_config.user_settings['Output_Dir']

但这不起作用。我该怎么办呢?

提前致谢。

3 个答案:

答案 0 :(得分:3)

当您分配到user_settings时,它会自动被视为initialize函数中的局部变量。要告诉Python该分配旨在改变全局变量,您需要编写

global user_settings

initialize的开头。

答案 1 :(得分:0)

在Python中,在函数体中分配的任何变量都被视为局部变量,除非它以globalnonlocal声明的方式显式声明不同

Python还会考虑分配任何“增强分配”运算符,例如+=/=

修改后的global强制声明是一个(小)价格,因为在Python中没有必要声明变量。

还假设您的代码不会过多地依赖于变异状态,因为它保留了全局变量,因此如果您的代码需要大量global声明,那么可能存在错误。

答案 2 :(得分:0)

我可以建议你解决这个问题。

首先,问题的根源是在初始化函数中创建新的局部变量

user_settings = yaml.safe_load(user_settings_file)

只要变量名称有等号,python就会在相应的范围内创建新变量(在本例中为initialize函数的本地

要避免这个,可以使用以下内容:

使用global声明

def initialize(user_settings_file)
    global user_settings # here it is
    with open(user_settings_file) as yaml_handle:
        user_settings = yaml.safe_load(user_settings_file)

修改现有变量但不创建新变量

user_settings = {}
def initialize(user_settings_file)
    with open(user_settings_file) as yaml_handle:
        user_settings.update(yaml.safe_load(user_settings_file)) # here we modify existing user_settings

使用模块属性进行操作(这个非常棘手)

user_settings = {}
def initialize(user_settings_file)
    with open(user_settings_file) as yaml_handle:
        import the_config
        the_config.user_settings = yaml.safe_load(user_settings_file)