代码之家  ›  专栏  ›  技术社区  ›  Eric O. Lebigot

如何以编程方式设置全局(模块)变量?

  •  33
  • Eric O. Lebigot  · 技术社区  · 15 年前

    我想用“程序化”的方式定义全局变量。我想做的事情是:

    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 上面的解决方案是可行的。但我有点不安,因为我担心 执行程序 不是实现模块全局设置目标的最干净的方法。

    3 回复  |  直到 8 年前
        1
  •  40
  •   Ned Batchelder    15 年前

    您可以在globals()返回的字典中设置globals:

    definitions = {'a': 1, 'b': 2, 'c': 123.4}
    for name, value in definitions.items():
        globals()[name] = value
    
        2
  •  53
  •   Nadia Alramli    15 年前

    下面是一个更好的方法:

    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
  •  4
  •   bobince    15 年前

    你说得对, exec 通常是个坏主意,在这种情况下当然不需要。

    内德的回答很好。如果您是一个模块,另一种可能的方法是导入您自己:

    基本常数.py:

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