Was übergebe ich als ersten Parameter " object
" an die Funktion setattr(object, name, value)
, um Variablen auf dem aktuellen Modul zu setzen?
Beispielsweise:
setattr(object, "SOME_CONSTANT", 42);
den gleichen Effekt geben wie:
SOME_CONSTANT = 42
innerhalb des Moduls, das diese Zeilen enthält (mit der richtigen object
).
Ich generiere dynamisch mehrere Werte auf Modulebene, und da ich __getattr__
auf Modulebene nicht definieren kann , ist dies mein Fallback.
vars()
auf Modulebene und nicht innerhalb einer Funktion aufrufen .vars()
ist äquivalent zuglobals()
at module scope (und gibt so ein wahres, modifizierbares Diktat zurück), aberlocals()
at function scope (und gibt so ein niemals zu modifizierendes Pseudodict zurück). Ich benutzevars()
im Modulbereich, da es 3 Zeichen, eine Silbe, gegenüber seinem Synonym in diesem Bereich speichertglobals()
;-)exec ''
: Zeit einer Funktion mit ein paar wesentlichen Schleifen in jede Richtung, und Sie werden die Bedeutung dieser Kernoptimierung für die Leistung von Python erkennen.Was ist falsch daran, wenn Sie Variablen mit Modulbereich innerhalb des Moduls festlegen müssen
global
?so:
quelle
global but not really
Erklärung immer (wobei "immer" als "die letzten Monate, in denen ich Python gelernt habe" definiert ist) als rätselhaft empfunden. Ich nehme an, es könnte ein historisches Relikt sein, das vor Modul-Namespaces liegt.In Python 3.7 können Sie
__getattr__
auf Modulebene verwenden ( zugehörige Antwort ).Gemäß PEP 562 :
quelle
globals()["SOME_CONSTANT"] = 42
quelle
SOME_CONSTANT
zur Laufzeit berechnet ist nicht genau konstant. Und wennglobals()
Ihnen dies nicht zur Verfügung steht, müssen Sie in ein anderes Modul greifen, um dessen Attribute zu ändern. Das wird die Leute sicherlich zum Staunen bringen.