Come impostare programmaticamente una variabile globale (modulo)?
-
07-07-2019 - |
Domanda
Vorrei definire i globi in un "programmatico" modo. Qualcosa di simile a quello che voglio fare sarebbe:
definitions = {'a': 1, 'b': 2, 'c': 123.4}
for definition in definitions.items():
exec("%s = %r" % definition) # a = 1, etc.
In particolare, voglio creare un modulo integralconstants
che contenga variabili a cui è possibile accedere come integralconstants.electron_mass
, ecc., in cui tutti i valori sono ottenuti analizzando un file (da qui la necessità di svolgere i compiti in modo "programmatico").
Ora, la soluzione exec
sopra funzionerebbe. Ma sono un po 'a disagio, perché temo che exec
non sia il modo più pulito per raggiungere l'obiettivo di impostare i globuli dei moduli.
Soluzione
Puoi impostare globali nel dizionario restituito da globals ():
definitions = {'a': 1, 'b': 2, 'c': 123.4}
for name, value in definitions.items():
globals()[name] = value
Altri suggerimenti
Ecco un modo migliore per farlo:
import sys
definitions = {'a': 1, 'b': 2, 'c': 123.4}
module = sys.modules[__name__]
for name, value in definitions.iteritems():
setattr(module, name, value)
Hai ragione, exec
è di solito una cattiva idea e in questo caso non è certamente necessaria.
La risposta di Ned va bene. Un altro modo possibile per farlo se sei un modulo è importare te stesso:
fundamentalconstants.py:
import fundamentalconstants
fundamentalconstants.life_meaning= 42
for line in open('constants.dat'):
name, _, value= line.partition(':')
setattr(fundamentalconstants, name, value)