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.

War es hilfreich?

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}")
  1. Sie würden nicht. Sie tun würden globals()["SOME_CONSTANT"] = 42
  2. Sie würden nicht. Sie würden speichern dynamisch generierte Inhalte irgendwo anders als ein Modul.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top