回答:
import sys
thismodule = sys.modules[__name__]
setattr(thismodule, name, value)
または、使用せずにsetattr
(これは質問の文字を壊しますが、同じ実用的な目的を満たします;-):
globals()[name] = value
注:モジュールスコープでは、後者は次と同等です。
vars()[name] = value
これはもう少し簡潔ですが、関数内からは機能しません(vars()
グローバルスコープで呼び出されると、モジュールの変数が呼び出されます。R/ Wを使用しても問題ありませんが、関数は関数で呼び出されたときの変数、およびそれはR / Oとして扱われる必要がある-Pythonオンラインドキュメントは、この特定の区別について少し混乱する可能性があります)。
vars()
が、関数内ではなくモジュールレベルのスコープで呼び出すと機能します。
vars()
globals()
atモジュールのスコープと同じです(したがって、真の変更可能なdictを返します)がlocals()
、関数のスコープと同じです(したがって、決して変更されることのない疑似dictを返します)。私vars()
はモジュールスコープで使用します。3文字、1音節、その同義語の同義語を保存するためですglobals()
;-)
exec ''
次のように開始します:関数をそれぞれ2つの実質的なループで時間を計ります。Python のパフォーマンスに対するこのコア最適化の重要性がわかります。
モジュール内からモジュールスコープ変数を設定する必要がある場合、何が問題になっていglobal
ますか?
# my_module.py
def define_module_scoped_variables():
global a, b, c
a, b, c = 'a', ['b'], 3
したがって:
>>> import my_module
>>> my_module.define_module_scoped_variables()
>>> a
NameError: name 'a' is not defined
>>> my_module.a
'a'
>>> my_module.b
['b']
global but not really
宣言を戸惑いました。モジュールの名前空間よりも古い歴史的な遺物かもしれない。
globals()["SOME_CONSTANT"] = 42
SOME_CONSTANT
実行時に計算されたものは正確に一定ではありません。そして、それglobals()
が利用できない場合は、別のモジュールにアクセスしてその属性を変更する必要があります。それは人々が不思議に思うようになるに違いありません。