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.

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top