Wie rufe ich setattr () auf dem aktuellen Modul?
-
05-10-2019 - |
Frage
Was gebe ich als erste Parameter „object
“, um die Funktion setattr(object, name, value)
, um Setvariablen auf dem aktuellen Modul?
Zum Beispiel:
setattr(object, "SOME_CONSTANT", 42);
gibt die gleiche Wirkung wie:
SOME_CONSTANT = 42
innerhalb des Moduls diese Zeilen (mit der korrekten object
) enthält.
Ich bin erzeugen mehrere Werte auf Modulebene dynamisch, und da ich nicht __getattr__
auf Modulebene definieren kann, das ist mein Rückfall.
Lösung
import sys
thismodule = sys.modules[__name__]
setattr(thismodule, name, value)
oder ohne Verwendung von setattr
(die den Buchstaben der Frage bricht aber erfüllt die gleichen praktischen Zwecke; -):
globals()[name] = value
Hinweis : am Modulumfang, letztere ist äquivalent zu:
vars()[name] = value
, die ein bisschen übersichtlicher ist, aber funktioniert nicht innerhalb einer Funktion (vars()
die Variablen des Umfangs gibt es heißt: die Modulgrößen als im globalen Bereich genannt, und es ist OK dann zu verwenden, es R / W , aber die Variablen der Funktion, wenn in einer Funktion aufgerufen, und dann muss es als R / O behandelt werden. - die Online-Dokumentation Python kann verwirrend über diese spezifische Unterscheidung ein wenig sein)
Andere Tipps
Wenn Sie Modul scoped Variablen innerhalb des Moduls einstellen müssen, was mit global
falsch?
# my_module.py
def define_module_scoped_variables():
global a, b, c
a, b, c = 'a', ['b'], 3
also:
>>> 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 verwenden ( zugehörige Antwort ).
PEP 562 :
def __getattr__(name):
if name == "SOME_CONSTANT":
return 42
raise AttributeError(f"module {__name__} has no attribute {name}")
- Sie würden nicht. Sie tun würden
globals()["SOME_CONSTANT"] = 42
- Sie würden nicht. Sie würden speichern dynamisch generierte Inhalte irgendwo anders als ein Modul.