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.

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top