2009-09-15 22 views
32

グローバルを「プログラム的」に定義したいと思います。私が何をしたいかのようなものは次のようになります。グローバル(モジュール)変数をプログラムで設定する方法は?

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がモジュールグローバルを設定する目標を達成する最もクリーンな方法ではないことが懸念されるからです。

答えて

37

あなたは)(グローバルで返される辞書にグローバルを設定することができます、あなたが正しい

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

+1、 'globals()'は実際に変更することができます(http://stackoverflow.com/questions/4859217/programmatically-creating-variables-in-python/4859312#4859312)。 – EOL

+1

ヒント:間違いなく上記のEOLの答えをお読みください。 –

+0

もう一つの良い点は、 'globals()'への変更がエラーなく持続することですが、 'locals()'ではそのような保証はありません。 – DuckPuncher

4

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

Nedの回答は問題ありません。あなたがモジュールなら、それを行うための別の可能な方法は、自分自身をインポートすることです:

fundamentalconstants.py:

import fundamentalconstants 

fundamentalconstants.life_meaning= 42 

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

私はこのモジュールの名前をハードコーディングするのに、Nadiaの 'import [__ name __]'を好む。 –

+0

興味深い:私はそれを考えなかった!モジュールファイル名の変更に対して堅牢ではないことは事実ですが、私が 'exec'を好むという興味深い考え方です! – EOL

48

ここではそれを行うには良い方法です:

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

これがなぜ優れているのか説明できるかもしれませんか? – tom10

+9

@ tom10の場合、_changes_と 'globals()'が実際に基礎モジュールに変更を永続させることは保証されていません。それは今日働く、明日壊れるかもしれない。ナディアのソリューションOTOHは堅実です(したがって私からの+1 ;-)。 –

+1

私はこのやり方が好きですが、locals()とglobals()について:現行のドキュメントは常に機能することを暗示しているようです: locals:現在のローカルシンボルテーブルを表す辞書を更新して返します。警告:この辞書の内容は変更しないでください。変更はインタープリタによって使用されるローカル変数の値に影響しないかもしれません。 globals:現在のグローバルシンボルテーブルを表す辞書を返します。これは常に現在のモジュールの辞書です。 多分、ドキュメントを微調整する必要があります... –

関連する問題