In großen Python-Projekten kann es aufgrund eines unsachgemäßen Architekturdesigns zu gegenseitigen Verweisen zwischen Modulen kommen. Der folgende Artikel stellt Ihnen hauptsächlich relevante Informationen zur Vermeidung des zirkulären Importproblems von Python vor. Lassen Sie uns gemeinsam einen Blick darauf werfen.
Vorwort
Bei der Verwendung von Paketen in Python treten häufig zirkuläre Importprobleme auf. Um dieses Problem zu veranschaulichen, haben wir das folgende Paket erstellt:
pkg ├── __init__.py ├── module_a.py └── module_b.py
Unter anderem spezifiziert
__init__.py pkg als ein Python-Paket, das in
module_a definiert ist. py Eine action_a()
-Funktion ist in module_b.py definiert, die auf ein Attribut in module_b.py verweist, beispielsweise eine Funktion oder Variable.
module_b.py definiert eine action_b()
-Funktion, die verweist zu module_a Ein Attribut in .py, z. B. eine Funktion oder Variable
In diesem Fall wird beim Ausführen des Pakets ein circular import error
-Fehler ausgegeben, d. h. ein Zirkelverweis, denn wenn module_a versucht, module_b einzuführen, und module_b muss zuerst module_a einführen, was dazu führt, dass der Python-Interpreter nicht ausgeführt werden kann.
Wir können jedoch einige clevere Methoden verwenden, um die obige Logik ordnungsgemäß funktionieren zu lassen und gleichzeitig durch Schleifen verursachte Fehler zu vermeiden.
Wann funktioniert es, wann nicht und was sind die Gründe für die Fälle, in denen es funktioniert?
Wann wird es funktionieren?
1. Am Anfang des Moduls einführen, nicht from verwenden, relative Einführung, nur gültig in Python 2
Beim Modul-Top-Import, z. B. import another_module
, bezieht sich die Funktion im Modul auf die Funktion oder Variable in another_module in der Form another_module.attribute
. Der Grund, warum diese Methode funktioniert, ist, dass import another_module
eine relative Referenz basierend auf dem aktuellen Verzeichnis ist und eine implizite Referenz ist. Wenn das Modul aus einem anderen Paket eingeführt wird, wird es ungültig. Darüber hinaus import another_module
Diese Syntax wird in Python3 nicht mehr unterstützt. Verwenden Sie diese Methode daher nicht in Ihrem Code, um die Einführung von Schleifen zu vermeiden.
Zum Beispiel:
# pkg/module_a.py from __future__ import print_function import module_b def action_a(): print(module_b.action_b.__name__) # pkg/module_b.py from __future__ import print_function import module_a def action_b(): print(module_a.action_a.__name__)
2. Nicht von verwenden, unbedingt importieren
Importieren Sie oben im Modul unter Verwendung des absoluten Pfads ausgehend vom Paket, z. B. import package.another_module
, und die Funktionen im Modul verweisen auf Funktionen oder Variablen in another_module im Form von package.another_module.attribute
. Der Grund, warum Sie den Paketnamen zum Importieren aufhängen müssen, liegt darin, dass import .another_module
diese Form des „relativen Imports“ einen Syntaxfehler meldet und den absoluten Import des Pakets aufhängt. Python 2 und 3 unterstützen beide
Fall:
# pkg/module_a.py from __future__ import print_function import pkg2.module_b def action_a(): print(pkg2.module_b.action_b.__name__) # pkg/module_b.py from __future__ import print_function import pkg2.module_a def action_b(): print(pkg2.module_a.action_a.__name__)
3 Fügen Sie das Attribut eines anderen Moduls am Ende des Moduls anstelle eines anderen Moduls ein, verwenden Sie from
wird am Ende des Moduls importiert (zumindest nach dem referenzierten Attribut), und die Attribute von another module
werden direkt eingeführt, z. B. von package.another_module import attribute
Es wird auch unterstützt, z. B. from .another_module import attribute
, und die Funktionen im Modul werden direkt verwendet. Verwenden Sie einfach das referenzierte Attribut.
Zum Beispiel:
# pkg/module_a.py from __future__ import print_function def action_a(): print(action_b.__name__) from .module_b import action_b # pkg/module_b.py from __future__ import print_function def action_b(): print(action_a.__name__) from .module_a import action_a
4. Oben in der Funktion eingeleitet, können Sie von verwenden
Der Import oben in der Funktion des Moduls, z. B. from package import another_module
, unterstützt auch den relativen Import. Es können entweder Module oder Attribute eingeführt werden.
Wie zum Beispiel:
# pkg/module_a.py from __future__ import print_function def action_a(): from . import module_b print(module_b.action_b.__name__) # pkg/module_b.py from __future__ import print_function def action_b(): from . import module_a print(module_a.action_a.__name__)
oder
# pkg/module_a.py from __future__ import print_function def action_a(): from .module_b import action_b print(action_b.__name__) # pkg/module_b.py from __future__ import print_function def action_b(): from .module_a import action_a print(action_a.__name__)
Dies Art Obwohl sowohl Python 2 als auch 3 diese Methode unterstützen, ist die Codierung nicht elegant genug und beeinträchtigt die Lesbarkeit des Codes. Es wird nicht empfohlen,
Hinweis
zu verwenden
Das in diesem Artikel behandelte Problem besteht darin, wie man die Einführung von Schleifen beim Aufrufen von Paketen in Python vermeidet
Wenn ein Python-Modul direkt auf der Befehlszeile ausgeführt wird, die anwendbare Situation ist nicht genau dieselbe
Das obige ist der detaillierte Inhalt vonEine Einführung in die Vermeidung zirkulärer Importmethoden in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!