我想以“程序化”的方式定义全局变量。类似于我想做的事情将是:
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
不是实现设置模块全局变量的最简洁方法。
答案 0 :(得分:54)
这是一种更好的方法:
import sys
definitions = {'a': 1, 'b': 2, 'c': 123.4}
module = sys.modules[__name__]
for name, value in definitions.iteritems():
setattr(module, name, value)
答案 1 :(得分:41)
您可以在globals()返回的字典中设置全局变量:
definitions = {'a': 1, 'b': 2, 'c': 123.4}
for name, value in definitions.items():
globals()[name] = value
答案 2 :(得分:4)
你是对的,exec
通常是一个坏主意,在这种情况下肯定不需要。
奈德的答案很好。如果你是一个模块,另一种可行的方法是自己导入:
fundamentalconstants.py:
import fundamentalconstants
fundamentalconstants.life_meaning= 42
for line in open('constants.dat'):
name, _, value= line.partition(':')
setattr(fundamentalconstants, name, value)