我知道有几篇关于此的帖子,但我仍然感到困惑。我试图在初始化时使用静态变量,并且不知道如何去做。所以我所拥有的是一个包'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']
但这不起作用。我该怎么办呢?
提前致谢。
答案 0 :(得分:3)
当您分配到user_settings
时,它会自动被视为initialize
函数中的局部变量。要告诉Python该分配旨在改变全局变量,您需要编写
global user_settings
在initialize
的开头。
答案 1 :(得分:0)
在Python中,在函数体中分配的任何变量都被视为局部变量,除非它以global
或nonlocal
声明的方式显式声明不同
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)