web-dev-qa-db-ja.com

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

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

例えば:

setattr(object, "SOME_CONSTANT", 42);

次と同じ効果が得られます。

SOME_CONSTANT = 42

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

モジュールレベルで動的に複数の値を生成していますが、__getattr__モジュールレベルでは、これが私のフォールバックです。

125
Matt Joiner
_import sys

thismodule = sys.modules[__name__]

setattr(thismodule, name, value)
_

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

_globals()[name] = value
_

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

_vars()[name] = value
_

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

194
Alex Martelli

モジュール内からモジュールスコープの変数を設定する必要がある場合、globalの何が問題になっていますか?

# my_module.py

def define_module_scoped_variables():
    global a, b, c
    a, b, c = 'a', ['b'], 3

副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example:

>>> import my_module
>>> my_module.define_module_scoped_variables()
>>> a
NameError: name 'a' is not defined
>>> my_module.a
'a'
>>> my_module.b
['b']
6
msw

Python 3.7では、__getattr__モジュールレベル( 関連する回答 )。

PEP 562

def __getattr__(name):
    if name == "SOME_CONSTANT":
        return 42
    raise AttributeError(f"module {__name__} has no attribute {name}")
4
Trey Hunner