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

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

Jan 09, 2017 am 11:44 AM

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
Nach dem Login kopieren
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
Nach dem Login kopieren


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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren
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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie löste ich das Problem der Berechtigungen beim Betrachten der Python -Version in Linux Terminal? Wie löste ich das Problem der Berechtigungen beim Betrachten der Python -Version in Linux Terminal? Apr 01, 2025 pm 05:09 PM

Lösung für Erlaubnisprobleme beim Betrachten der Python -Version in Linux Terminal Wenn Sie versuchen, die Python -Version in Linux Terminal anzuzeigen, geben Sie Python ein ...

Wie kann ich die gesamte Spalte eines Datenrahmens effizient in einen anderen Datenrahmen mit verschiedenen Strukturen in Python kopieren? Wie kann ich die gesamte Spalte eines Datenrahmens effizient in einen anderen Datenrahmen mit verschiedenen Strukturen in Python kopieren? Apr 01, 2025 pm 11:15 PM

Bei der Verwendung von Pythons Pandas -Bibliothek ist das Kopieren von ganzen Spalten zwischen zwei Datenrahmen mit unterschiedlichen Strukturen ein häufiges Problem. Angenommen, wir haben zwei Daten ...

Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer-Anfänger-Programmierbasis in Projekt- und problemorientierten Methoden? Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer-Anfänger-Programmierbasis in Projekt- und problemorientierten Methoden? Apr 02, 2025 am 07:18 AM

Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer -Anfänger für Programmierungen? Wenn Sie nur 10 Stunden Zeit haben, um Computer -Anfänger zu unterrichten, was Sie mit Programmierkenntnissen unterrichten möchten, was würden Sie dann beibringen ...

Wie hört Uvicorn kontinuierlich auf HTTP -Anfragen ohne Serving_forver () an? Wie hört Uvicorn kontinuierlich auf HTTP -Anfragen ohne Serving_forver () an? Apr 01, 2025 pm 10:51 PM

Wie hört Uvicorn kontinuierlich auf HTTP -Anfragen an? Uvicorn ist ein leichter Webserver, der auf ASGI basiert. Eine seiner Kernfunktionen ist es, auf HTTP -Anfragen zu hören und weiterzumachen ...

Wie erstelle ich dynamisch ein Objekt über eine Zeichenfolge und rufe seine Methoden in Python auf? Wie erstelle ich dynamisch ein Objekt über eine Zeichenfolge und rufe seine Methoden in Python auf? Apr 01, 2025 pm 11:18 PM

Wie erstellt in Python ein Objekt dynamisch über eine Zeichenfolge und ruft seine Methoden auf? Dies ist eine häufige Programmieranforderung, insbesondere wenn sie konfiguriert oder ausgeführt werden muss ...

Wie kann man vom Browser vermeiden, wenn man überall Fiddler für das Lesen des Menschen in der Mitte verwendet? Wie kann man vom Browser vermeiden, wenn man überall Fiddler für das Lesen des Menschen in der Mitte verwendet? Apr 02, 2025 am 07:15 AM

Wie kann man nicht erkannt werden, wenn Sie Fiddlereverywhere für Man-in-the-Middle-Lesungen verwenden, wenn Sie FiddLereverywhere verwenden ...

Was sind einige beliebte Python -Bibliotheken und ihre Verwendung? Was sind einige beliebte Python -Bibliotheken und ihre Verwendung? Mar 21, 2025 pm 06:46 PM

In dem Artikel werden beliebte Python-Bibliotheken wie Numpy, Pandas, Matplotlib, Scikit-Learn, TensorFlow, Django, Flask und Anfragen erörtert, die ihre Verwendung in wissenschaftlichen Computing, Datenanalyse, Visualisierung, maschinellem Lernen, Webentwicklung und h beschreiben

See all articles