Reputation: 541
In my main class I use a global variable ADDRESS that is defined in another file called config.py. I want to change the value of ADDRESS from within my main class, by calling a function in config.py.
In my main class I have:
from config import ADDRESS, change_address
change_address("192.168.10.100")
print("new address " + ADDRESS)
In my config file I have the following:
ADDRESS = "0.0.0.0"
def change_address(address):
global ADDRESS
ADDRESS = address
print("changed address to: " + ADDRESS)
The print statement in my config file correctly prints the new address of 192.168.10.100. However, the print statement in my main class prints 0.0.0.0. What am I missing here?
Upvotes: 11
Views: 13182
Reputation: 3157
I would recommend that you try not to change the global state in a module. Instead, I would re-write the code such that ADDRESS
in config.py doesn't change. If the configuration for your application can change from invocation to invocation I would change config to be something like:
ADDRESS = '0.0.0.0'
def get_default_config():
return {'address': ADDRESS, 'some_other_config_value': 'foo'}
Then in main I would do:
app_config = config.get_default_config()
app_config = "192.168.10.100"
print("new address " + app_config['address']
As a general rule it isn't a good idea to change the value of variables/constants in other modules.
NOTE: You could also create a config class as well, so that you could access configuration values like config.address.
I recommend that you read the stackexchange post Why is Global State so Evil?
Upvotes: 0
Reputation: 96360
All that from config import ADDRESS, change_address
does is take ADDRESS
and change_address
from your config
module's namespace and dumps it into your current module's name-space. Now, if you reassign the value of ADDRESS
in config
's namespace, it won't be seen by the current module - that's how name-spaces work. It is like doing the following:
>>> some_namespace = {'a':1}
>>> globals().update(some_namespace)
>>> a
1
>>> some_namespace
{'a': 1}
>>> some_namespace['a'] = 99
>>> a
1
>>> some_namespace
{'a': 99}
The simplest solution? Don't clobber name-spaces:
import config
config.change_address("192.168.10.100")
print("new address " + config.ADDRESS)
Upvotes: 12