0

我知道已经有几个关于这个的帖子,但我仍然感到困惑。我正在尝试使用带有初始化的静态变量,但不知道该怎么做。所以我有一个包'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']

但这不起作用。请问我该怎么做?

提前致谢。

4

3 回答 3

3

当您分配给 时user_settings,它会自动被视为initialize函数中的局部变量。要告诉 Python 赋值是为了改变全局变量,你需要写

global user_settings

开始时initialize

于 2013-09-23T17:26:40.420 回答
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)
于 2013-09-23T17:51:53.087 回答
0

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

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

修改的强制声明global是一个(很小的)代价,因为在 Python 中不需要声明变量。

还假设您的代码不太依赖于变异状态,因为它保留了全局变量,因此如果您的代码需要大量global声明,那么可能有问题。

于 2013-09-23T17:35:04.510 回答