Python: cambia la variable global desde otro archivo

En mi clase principal, uso una variable global DIRECCIÓN que se define en otro archivo llamado config.py. Quiero cambiar el valor de DIRECCIÓN desde mi clase principal, llamando a una función en config.py.

En mi clase principal tengo:

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

En mi archivo de configuración tengo lo siguiente:

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

La statement de impresión en mi archivo de configuración imprime correctamente la nueva dirección de 192.168.10.100. Sin embargo, la statement de impresión en mi clase principal imprime 0.0.0.0. ¿Que me estoy perdiendo aqui?

Todo lo que se hace from config import ADDRESS, change_address hace es tomar ADDRESS y change_address desde el espacio de nombres de su módulo de config y change_address en el espacio de nombres de su módulo actual. Ahora, si reasigna el valor de ADDRESS en el espacio de nombres de config , el módulo actual no lo verá, así es como funcionan los espacios de nombres. Es como hacer lo siguiente:

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

¿La solución más sencilla? No pegar espacios de nombres:

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

Le recomendaría que intente no cambiar el estado global en un módulo. En su lugar, volvería a escribir el código de modo que la ADDRESS en config.py no cambie. Si la configuración de su aplicación puede cambiar de invocación a invocación, cambiaría config para que sea algo como:

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

Entonces, en lo principal, haría:

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

Como regla general, no es una buena idea cambiar el valor de las variables / constantes en otros módulos.

NOTA: También puede crear una clase de configuración, de modo que pueda acceder a valores de configuración como config.address.

Te recomiendo que leas la publicación de stackexchange ¿Por qué es Global State tan Evil?