Ответ 1
Вы можете установить глобальные значения в словаре, возвращаемом globals():
definitions = {'a': 1, 'b': 2, 'c': 123.4}
for name, value in definitions.items():
globals()[name] = value
Я хотел бы определить глобальные переменные "программным" способом. Нечто похожее на то, что я хочу сделать, будет:
definitions = {'a': 1, 'b': 2, 'c': 123.4}
for definition in definitions.items():
exec("%s = %r" % definition) # a = 1, etc.
В частности, я хочу создать модуль fundamentalconstants
, который содержит переменные, к которым можно получить доступ как fundamentalconstants.electron_mass
и т.д., где все значения получены путем разбора файла (следовательно, необходимость выполнять назначения в "программном" ).
Теперь решение exec
выше будет работать. Но я немного обеспокоен этим, потому что я боюсь, что exec
- не самый чистый способ достичь цели установки глобальных глобул.
Вы можете установить глобальные значения в словаре, возвращаемом globals():
definitions = {'a': 1, 'b': 2, 'c': 123.4}
for name, value in definitions.items():
globals()[name] = value
Вот лучший способ сделать это:
import sys
definitions = {'a': 1, 'b': 2, 'c': 123.4}
module = sys.modules[__name__]
for name, value in definitions.iteritems():
setattr(module, name, value)
Вы правы, exec
, как правило, плохая идея, и в этом случае она не нужна.
Ответ Ned в порядке. Другой возможный способ сделать это, если вы являетесь модулем, - это импортировать себя:
fundamentalconstants.py:
import fundamentalconstants
fundamentalconstants.life_meaning= 42
for line in open('constants.dat'):
name, _, value= line.partition(':')
setattr(fundamentalconstants, name, value)