web-dev-qa-db-de.com

Wie rufe ich setattr () auf dem aktuellen Modul auf?

Was übergebe ich als ersten Parameter "object" an die Funktion setattr(object, name, value), um Variablen für das aktuelle Modul festzulegen?

Beispielsweise:

setattr(object, "SOME_CONSTANT", 42);

mit dem gleichen Effekt wie:

SOME_CONSTANT = 42

innerhalb des Moduls, das diese Zeilen enthält (mit dem korrekten object).

Ich generiere dynamisch mehrere Werte auf Modulebene und da ich __getattr__ Auf Modulebene nicht definieren kann, ist dies mein Fallback.

125
Matt Joiner
import sys

thismodule = sys.modules[__name__]

setattr(thismodule, name, value)

oder, ohne setattr zu verwenden (was den Buchstaben der Frage durchbricht, aber die gleichen praktischen Zwecke erfüllt ;-):

globals()[name] = value

Anmerkung: im Modulumfang entspricht letzterer:

vars()[name] = value

das ist ein bisschen prägnanter, funktioniert aber nicht innerhalb einer Funktion (vars() gibt die Variablen des Gültigkeitsbereichs an, in dem es aufgerufen wird: die Variablen des Moduls, wenn es im globalen Gültigkeitsbereich aufgerufen wird, und dann kann es verwendet werden R/W, aber die Variablen der Funktion, wenn sie in einer Funktion aufgerufen werden, und sie müssen dann als R/O behandelt werden - die Python Online-Dokumente können etwas verwirrend bezüglich dieser spezifischen Unterscheidung sein).

194
Alex Martelli

Wenn Sie modulbezogene Variablen innerhalb des Moduls festlegen müssen, was ist mit global falsch?

# my_module.py

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

somit:

>>> 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

In Python 3.7 können Sie __getattr__ auf Modulebene ( zugehörige Antwort ).

Per PEP 562 :

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