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

Eri*_*got 35 python module global-variables

我想以"程序化"的方式定义全局变量.类似于我想做的事情将是:

definitions = {'a': 1, 'b': 2, 'c': 123.4}
for definition in definitions.items():
    exec("%s = %r" % definition)  # a = 1, etc.
Run Code Online (Sandbox Code Playgroud)

具体来说,我想创建一个fundamentalconstants包含可以作为fundamentalconstants.electron_mass等访问的变量的模块,其中所有值都是通过解析文件获得的(因此需要以"编程"方式进行分配).

现在,exec上面的解决方案将起作用.但我对它有点不安,因为我担心这exec不是实现设置模块全局变量目标的最简洁方法.

Nad*_*mli 58

这是一个更好的方法:

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

  • @ tom10,没有文件证明_changes_到`globals()`实际上会将更改保存到底层模块.它今天有效,明天可能会破产.Nadia的解决方案OTOH是坚固的(因此+1来自我;-). (10认同)
  • 也许你可以形容为什么这更好? (8认同)
  • @Alex:似乎`globals()`(至少截至目前)是可更新的.参考:http://stackoverflow.com/questions/4859217/programmatically-creating-variables-in-python/4859312#4859312(与ncoghlan讨论). (4认同)
  • 我喜欢这种方式,但关于 locals() 和 globals():当前文档似乎暗示它将始终有效: locals:更新并返回表示当前本地符号表的字典。警告:本词典的内容不得修改;更改可能不会影响解释器使用的局部变量的值。globals:返回表示当前全局符号表的字典。这始终是当前模块的字典。也许文档需要调整...... (2认同)

Ned*_*der 41

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

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

  • +1,因为`globals()`确实可以修改(http://stackoverflow.com/questions/4859217/programmatically-creating-variables-in-python/4859312#4859312). (9认同)