Heim  >  Artikel  >  Backend-Entwicklung  >  Eine Einführung in die Vermeidung zirkulärer Importmethoden in Python

Eine Einführung in die Vermeidung zirkulärer Importmethoden in Python

巴扎黑
巴扎黑Original
2017-09-16 10:07:481415Durchsuche

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn