Подтвердить что ты не робот

Как программно установить глобальную (модульную) переменную?

Я хотел бы определить глобальные переменные "программным" способом. Нечто похожее на то, что я хочу сделать, будет:

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 - не самый чистый способ достичь цели установки глобальных глобул.

4b9b3361

Ответ 1

Вы можете установить глобальные значения в словаре, возвращаемом globals():

definitions = {'a': 1, 'b': 2, 'c': 123.4}
for name, value in definitions.items():
    globals()[name] = value

Ответ 2

Вот лучший способ сделать это:

import sys
definitions = {'a': 1, 'b': 2, 'c': 123.4}
module = sys.modules[__name__]
for name, value in definitions.iteritems():
    setattr(module, name, value)

Ответ 3

Вы правы, exec, как правило, плохая идея, и в этом случае она не нужна.

Ответ Ned в порядке. Другой возможный способ сделать это, если вы являетесь модулем, - это импортировать себя:

fundamentalconstants.py:

import fundamentalconstants

fundamentalconstants.life_meaning= 42

for line in open('constants.dat'):
    name, _, value= line.partition(':')
    setattr(fundamentalconstants, name, value)