¿Cómo establecer mediante programación una variable global (módulo)?
-
07-07-2019 - |
Pregunta
Me gustaría definir los globales en una " programática " camino. Algo similar a lo que quiero hacer sería:
definitions = {'a': 1, 'b': 2, 'c': 123.4}
for definition in definitions.items():
exec("%s = %r" % definition) # a = 1, etc.
Específicamente, quiero crear un módulo fundamentalconstants
que contenga variables a las que se pueda acceder como fundamentalconstants.electron_mass
, etc., donde todos los valores se obtienen analizando un archivo (de ahí la necesidad de hacer las tareas de forma programática).
Ahora, la solución exec
anterior funcionaría. Pero estoy un poco incómodo con eso, porque me temo que exec
no es la forma más limpia de lograr el objetivo de configurar los módulos globales.
Solución
Puede establecer globales en el diccionario devuelto por globals ():
definitions = {'a': 1, 'b': 2, 'c': 123.4}
for name, value in definitions.items():
globals()[name] = value
Otros consejos
Aquí hay una mejor manera de hacerlo:
import sys
definitions = {'a': 1, 'b': 2, 'c': 123.4}
module = sys.modules[__name__]
for name, value in definitions.iteritems():
setattr(module, name, value)
Tienes razón, exec
suele ser una mala idea y ciertamente no es necesario en este caso.
La respuesta de Ned está bien. Otra forma posible de hacerlo si eres un módulo es importándote a ti mismo:
fundamentalconstants.py:
import fundamentalconstants
fundamentalconstants.life_meaning= 42
for line in open('constants.dat'):
name, _, value= line.partition(':')
setattr(fundamentalconstants, name, value)