グローバルを「プログラム的」な方法で定義したいと思います。私がやりたいことと似たようなことは次のようになります。
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
がモジュールのグローバルを設定するという目標を達成するための最もクリーンな方法ではないのではないかと心配しているので、少し不安です。
Globals()によって返されるディクショナリでグローバルを設定できます。
definitions = {'a': 1, 'b': 2, 'c': 123.4}
for name, value in definitions.items():
globals()[name] = value
これを行うためのより良い方法は次のとおりです。
import sys
definitions = {'a': 1, 'b': 2, 'c': 123.4}
module = sys.modules[__name__]
for name, value in definitions.iteritems():
setattr(module, name, value)
そうです、exec
は通常悪い考えであり、この場合は確かに必要ありません。
ネッドの答えは大丈夫です。モジュールの場合にそれを行う別の可能な方法は、自分自身をインポートすることです。
basicconstants.py:
import fundamentalconstants
fundamentalconstants.life_meaning= 42
for line in open('constants.dat'):
name, _, value= line.partition(':')
setattr(fundamentalconstants, name, value)