繁体   English   中英

Python:从另一个文件中更改全局变量

[英]Python: change global variable from within another file

在我的主类中,我使用了另一个名为config.py的文件中定义的全局变量ADDRESS。 我想通过调用config.py中的函数来从我的主类中更改ADDRESS的值。

在我的主要课程中,我有:

from config import ADDRESS, change_address
change_address("192.168.10.100")
print("new address " + ADDRESS)

在我的配置文件中,我有以下内容:

ADDRESS = "0.0.0.0"

def change_address(address):
    global ADDRESS
    ADDRESS = address
    print("changed address to: " + ADDRESS)

我的配置文件中的print语句正确打印新地址192.168.10.100。 但是,我的主类中的print语句打印0.0.0.0。 我在这里错过了什么?

所有from config import ADDRESS, change_address所做的就是从config模块的命名空间中获取ADDRESSchange_address ,并将其转储到当前模块的名称空间中。 现在,如果在config的命名空间中重新分配ADDRESS的值,那么当前模块将无法看到它 - 这就是名称空间的工作方式。 这就像做以下事情:

>>> some_namespace = {'a':1}
>>> globals().update(some_namespace)
>>> a
1
>>> some_namespace
{'a': 1}
>>> some_namespace['a'] = 99
>>> a
1
>>> some_namespace
{'a': 99}

最简单的解决方案? 不要破坏名称空间:

import config
config.change_address("192.168.10.100")
print("new address " + config.ADDRESS)

我建议您尽量不要更改模块中的全局状态。 相反,我会重写代码,使config.py中的ADDRESS不会改变。 如果应用程序的配置可以从调用更改为调用,我会将配置更改为:

ADDRESS = '0.0.0.0'

def get_default_config():
    return {'address': ADDRESS, 'some_other_config_value': 'foo'}

然后在主要我会做:

app_config = config.get_default_config()
app_config = "192.168.10.100"
print("new address " + app_config['address']

作为一般规则,在其他模块中更改变量/常量的值不是一个好主意。

注意:您也可以创建一个配置类,以便您可以访问配置值,如config.address。

我建议您阅读stackexchange帖子为什么Global State如此邪恶?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM