Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung des relativen Imports und des absoluten Imports in Python

Detaillierte Erläuterung des relativen Imports und des absoluten Imports in Python

高洛峰
高洛峰Original
2017-01-09 11:44:101563Durchsuche

Vorwort

Python relativer Import und absoluter Import, diese beiden Konzepte beziehen sich auf den Import innerhalb des Pakets. Paketinterner Import bedeutet, dass Module innerhalb des Pakets Module innerhalb des Pakets importieren.

Suchpfad für Python-Import

Suche nach dem Modul im aktuellen Verzeichnis

Suche

Suche

Python-Importschritte in der lib-Bibliothek des Python-Installationspfads


Python Alle geladenen Modulinformationen werden beim Importieren eines Moduls in der sys.modules-Struktur gespeichert. Dies wird wie folgt durchgeführt:

Wenn es sich um Import A handelt, prüfen Sie, ob A bereits in sys.modules vorhanden ist. Wenn nicht, wird ein Modulobjekt für A erstellt lade A

Wenn es von A ist, importiere B, erstelle zuerst ein Modulobjekt für A, dann analysiere A, finde B daraus und fülle es in A's __dict__


Relativer Import und absoluter Import


Das Format des absoluten Imports ist import A.B oder from A import B, und das Format des relativen Imports ist from ..A import B, . .. stellt das obere Modul dar, ... stellt das obere Modul dar und so weiter.

Durch den relativen Import können Wartungsprobleme vermieden werden, die durch harte Codierung verursacht werden. Wenn wir beispielsweise den Namen eines Pakets der obersten Ebene ändern, sind alle Importe seiner Unterpakete nicht mehr verfügbar. Allerdings können Module mit relativen Importanweisungen nicht direkt ausgeführt werden, sonst kommt es zu einer Ausnahme:

ValueError: Attempted relative import in non-package
Was ist der Grund dafür? Beim Importieren von Modulen müssen wir zunächst einige Regeln verstehen:

Wenn die Paketstruktur nicht explizit angegeben ist, bestimmt Python die Struktur eines Moduls im Paket basierend auf __name__. Wenn es __main__ ist, dann ist es es selbst ein Modul der obersten Ebene ohne Paketstruktur. Wenn es sich um eine A.B.C-Struktur handelt, ist das Modul der obersten Ebene A. Befolgen Sie grundsätzlich dieses Prinzip:

Wenn es sich um einen absoluten Import handelt, kann ein Modul nur seine eigenen Submodule oder Module und deren Submodule auf derselben Ebene wie sein Modul der obersten Ebene importieren.

Wenn dies der Fall ist ein relativer Import Import, ein Modul muss eine Paketstruktur haben und kann nur Module innerhalb seines Top-Level-Moduls importieren


Wenn ein Modul direkt ausgeführt wird, ist es selbst das Top-Level-Modul und das gibt es auch Keine Hierarchie, daher kann der relative Pfad zu anderen nicht gefunden werden.

Python2.x verwendet standardmäßig den relativen Pfadimport und Python3.x standardmäßig den absoluten Pfadimport. Durch den absoluten Import kann vermieden werden, dass durch den Import von Unterpaketen Standardbibliotheksmodule überschrieben werden (Konflikte aufgrund desselben Namens). Wenn Sie in Python2 standardmäßig den absoluten Import verwenden möchten, wird der Import als absoluter Import betrachtet, was bedeutet, dass der implizite relative Import deaktiviert ist, der explizite relative Import jedoch nicht.

Was ist also ein impliziter relativer Import und was ist ein expliziter relativer Import? Schauen wir uns ein Beispiel an. Angenommen, es gibt die folgende Paketstruktur:
from __future__ import absolute_import


Wenn Sie dann im Tool auf Bench verweisen, gibt es die folgenden Möglichkeiten:

Implizit relativ bedeutet nein. Sagt dem Interpreter relativ zu wem, aber die Standardeinstellung ist relativ zum aktuellen Modul; während explizit relativ dem Interpreter explizit mitgeteilt wird, zu wem importiert werden soll. Die dritte Importmethode wird offiziell empfohlen. Die erste Methode wird in Python3 nicht mehr empfohlen. Diese Methode kann nur zum Importieren von Modulen im Pfad verwendet werden.

Relativ und absolut gelten nur für In-Package-Importe
thing
├── books
│ ├── adventure.py
│ ├── history.py
│ ├── horror.py
│ ├── __init__.py
│ └── lovestory.py
├── furniture
│ ├── armchair.py
│ ├── bench.py
│ ├── __init__.py
│ ├── screen.py
│ └── stool.py
└── __init__.py

Abschließend wird noch einmal betont, dass relative Importe und absolute Importe nur für In-Package-Importe gelten, ansonsten gilt das in Dieser Artikel macht einfach keinen Sinn. Das sogenannte Paket ist das Verzeichnis, das die Datei __init__.py enthält. Diese Datei wird zuerst ausgeführt, wenn das Paket importiert wird. Die Datei kann leer sein oder ihr kann beliebiger legaler Python-Code hinzugefügt werden.
import bench     # 此为 implicit relative import
from . import bench   # 此为 explicit relative import
from furniture import bench # 此为 absolute import

Der relative Import kann harte Codierung vermeiden und ist benutzerfreundlich für die Paketwartung. Durch den absoluten Import können Namenskonflikte mit der Standardbibliothek vermieden werden. Tatsächlich wird nicht empfohlen, dass benutzerdefinierte Module dieselben Befehle wie die Standardbibliothek haben.

Wie bereits erwähnt, können Module, die relative Importe enthalten, nicht direkt ausgeführt werden. Tatsächlich wird ImportError nicht angezeigt:

Dies unterscheidet sich von absoluten Importen . Es ist der gleiche Grund. Um Module in einem Paket auszuführen, die absolute und relative Importe enthalten, können Sie dem Interpreter die Modulhierarchie mit python -m A.B.C mitteilen.

Jemand könnte fragen: Wenn sich zwei Module a.py und b.py im selben Verzeichnis befinden, warum können Sie dann a in b.py importieren?

Das liegt daran, dass das Verzeichnis, in dem sich diese beiden Dateien befinden, kein Paket ist, sodass jede Python-Datei ein unabhängiges Modul ist, das von anderen Modulen direkt importiert werden kann, genau wie Sie die Standardbibliothek importieren, sie sind es nicht Es gibt Probleme mit relativen Importen und absoluten Importen. Relative Importe und absolute Importe werden nur innerhalb von Paketen verwendet.

ImportError: No module named XXX
Zusammenfassung

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels für alle beim Erlernen oder Verwenden von Python hilfreich sein kann eine Botschaft zum Mitteilen.

Ausführlichere Erläuterungen zu relativen Importen und absoluten Importen in Python finden Sie auf der chinesischen PHP-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