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.
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).
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']
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}")