Как программно установить глобальную (модульную) переменную? - PullRequest
35 голосов
/ 16 сентября 2009

Я хотел бы определить глобальные «программным» образом. Что-то похожее на то, что я хочу сделать, будет:

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

Ответы [ 3 ]

56 голосов
/ 16 сентября 2009

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

import sys
definitions = {'a': 1, 'b': 2, 'c': 123.4}
module = sys.modules[__name__]
for name, value in definitions.iteritems():
    setattr(module, name, value)
41 голосов
/ 16 сентября 2009

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

definitions = {'a': 1, 'b': 2, 'c': 123.4}
for name, value in definitions.items():
    globals()[name] = value
4 голосов
/ 16 сентября 2009

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

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

fundamentalconstants.py:

import fundamentalconstants

fundamentalconstants.life_meaning= 42

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