Python-Haken für die Modul-Initialisierung
Habe ich ein python - module_A
tut sich etwas:
myvar = "Hello"
def message():
print myvar
Aus einem anderen Modul möchte ich importieren die Funktion message
:
from module_A import message
Aber das ist die Definition myvar
, was ich nicht will (aus Gründen, die nicht wirklich relevant hier). Ich denke, was ich brauchen, ist eine Unterscheidung zwischen importieren, die Dinge aus einem Modul, und mit jede der importierten Symbole. Eigentlich will ich myvar
initialisiert werden nur wenn ich message
.
Ich da jede Art von python-Haken, die ich verwenden könnte, zu initialisieren Sachen an, wenn eine Funktion oder eine Klasse zugegriffen wird? Ich möchte etwas ähnliches wie die folgenden:
module_setup_done = False
def setup():
global module_setup_done, myvar
if not module_setup_done:
myvar = "Hello"
module_setup_done = True
def message():
setup()
print myvar
Aber, um die übersichtlichkeit zu bewahren, möchte ich diese automatisch angerufen werden, so etwas wie dieses:
def _init_module():
global myvar
myvar = "Hello"
def message():
print myvar
Wo _init_module()
würde nur aufgerufen werden einmal, und nur das erste mal, dass etwas in der Modul ist zugegriffen, nicht, wenn etwas importiert.
Gibt es Unterstützung für diese Art von Muster in python?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, es gibt keine integrierte Unterstützung für diese. Wenn Sie initialisieren möchten, die Dinge getrennt von den Import der module, eine Funktion schreiben, die das tut, die Initialisierung, dann rufen Sie die Funktion wenn Sie möchten, initialisieren Sie diese Dinge. Wenn Sie auf "automatisch" initialisieren Dinge, wenn andere Dinge genannt werden, die Sie haben zu handhaben, dass Sie sich mit dem code entlang der Linien von, was Sie bereits gepostet.
Wenn Sie finden, sich selbst zu tun, dass, obwohl, sind Sie wahrscheinlich etwas zu tun unpythonic. Sie geben keine details darüber, warum Sie es tun, hier, aber im Allgemeinen diese Art der impliziten Initialisierung ist nicht eine gute Praxis in Python. Die Dinge sind initialisiert, wenn Sie explizit sagen, Sie werden, zum Beispiel durch importieren eines Moduls oder das aufrufen irgendeine Art von Funktion zur Initialisierung. Warum hast du das Bedürfnis zu haben, dieses separate, implizite Initialisierung Schritt?