現在のモジュールでsetattr()を呼び出すにはどうすればよいですか?


140

現在のモジュールに変数を設定するには、最初のパラメーター " object" として関数setattr(object, name, value)に何を渡しますか?

例えば:

setattr(object, "SOME_CONSTANT", 42);

同じ効果を与える:

SOME_CONSTANT = 42

これらの行を含むモジュール内(正しいobject)。

モジュールレベルでいくつかの値を動的に生成しています。モジュールレベルでは定義できないため__getattr__、これがフォールバックです。

回答:


220
import sys

thismodule = sys.modules[__name__]

setattr(thismodule, name, value)

または、使用せずにsetattr(これは質問の文字を壊しますが、同じ実用的な目的を満たします;-):

globals()[name] = value

:モジュールスコープでは、後者は次と同等です。

vars()[name] = value

これはもう少し簡潔ですが、関数内からは機能しません(vars()グローバルスコープで呼び出されると、モジュールの変数が呼び出されます。R/ Wを使用しても問題ありませんが、関数は関数で呼び出されたときの変数、およびそれはR / Oとして扱われる必要がある-Pythonオンラインドキュメントは、この特定の区別について少し混乱する可能性があります)。


9
ドキュメントはvars()の変更に関する警告を示します。docs.python.org/library/functions.html#vars。これはいつ大丈夫ですか?
unutbu

2
@〜unutbu、本当に「大丈夫」だとは言いませんvars()が、関数内ではなくモジュールレベルのスコープで呼び出すと機能します。
マイクグラハム、

4
vars()globals()atモジュールのスコープと同じです(したがって、真の変更可能なdictを返します)がlocals()、関数のスコープと同じです(したがって、決して変更されることのない疑似dictを返します)。私vars()はモジュールスコープで使用します。3文字、1音節、その同義語の同義語を保存するためですglobals();-)
Alex Martelli

14
はい、それはPythonコンパイラーが行う最も重要な単一の最適化を破壊します:関数のローカル変数はdictに保持され、値のタイトなベクトルにあり、各ローカル変数アクセスはそのベクトルのインデックスを使用します名前の検索。最適化を無効にして、存在するディクテーションを強制するには、関数をexec ''次のように開始します:関数をそれぞれ2つの実質的なループで時間を計ります。Python のパフォーマンスに対するこのコア最適化の重要性がわかります。
Alex Martelli、2010年

3
@msw、私はあなたが「実用性が純粋さを打つ」ことを忘れたと思います;-)。
Alex Martelli、2010年

6

モジュール内からモジュールスコープ変数を設定する必要がある場合、何が問題になってい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']

1
ええ、私はいつも(「常に」は「私がPythonを学んできた最後の数か月」と定義されています)、そのglobal but not really宣言を戸惑いました。モジュールの名前空間よりも古い歴史的な遺物かもしれない。
msw

1
元の質問は、名前が文字列で与えられている属性を設定する方法を尋ねているためです(私が現在検索しているのと同じことです)。これは役に立ちません。
2016


-1
  1. あなたはしません。あなたはするだろうglobals()["SOME_CONSTANT"] = 42
  2. あなたはしません。動的に生成されたコンテンツをモジュール以外の場所に保存します。

はい、SOME_CONSTANT実行時に計算されたものは正確に一定ではありません。そして、それglobals()が利用できない場合は、別のモジュールにアクセスしてその属性を変更する必要があります。それは人々が不思議に思うようになるに違いありません。
msw

3
定数と可変は相互に排他的です。定数と動的に生成されていません。私が生成している値は常に同じであり、さらに「定数」に基づいて決定されるので、私の部分での算術演算と入力を節約できます。
マットジョイナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.