web-dev-qa-db-ja.com

プログラムでグローバル(モジュール)変数を設定するにはどうすればよいですか?

グローバルを「プログラム的」な方法で定義したいと思います。私がやりたいことと似たようなことは次のようになります。

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

具体的には、fundamentalconstants.electron_massなどとしてアクセスできる変数を含むモジュールfundamentalconstantsを作成します。このモジュールでは、すべての値がファイルの解析によって取得されます(したがって、で割り当てを行う必要があります。 「プログラマティック」な方法)。

これで、上記のexecソリューションが機能します。しかし、execがモジュールのグローバルを設定するという目標を達成するための最もクリーンな方法ではないのではないかと心配しているので、少し不安です。

35
Eric O Lebigot

Globals()によって返されるディクショナリでグローバルを設定できます。

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

これを行うためのより良い方法は次のとおりです。

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

そうです、execは通常悪い考えであり、この場合は確かに必要ありません。

ネッドの答えは大丈夫です。モジュールの場合にそれを行う別の可能な方法は、自分自身をインポートすることです。

basicconstants.py:

import fundamentalconstants

fundamentalconstants.life_meaning= 42

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