Geschichte: Pakete wurden in Python eingeführt, um große Codebasen zu strukturieren und Code wiederzuverwenden. Sie ermöglichen es, ein Projekt in logische Module zu unterteilen und die Wartung und den Import der benötigten Funktionalität zu erleichtern.
Problem: Ein falsches Verständnis der Struktur von Paketen führt zu Importfehlern, Namenskonflikten und Laufzeitfehlern von Skripten. Es ist wichtig, den Unterschied zwischen Paketen und Modulen zu kennen sowie die Regeln für relative und absolute Importe zu verstehen.
Lösung:
Ein Paket ist jedes Verzeichnis mit einer Datei __init__.py (leer oder mit Initialisierungscode). Pakete können andere Pakete und Module enthalten. Beispielstruktur:
project/
├── mypackage/
│ ├── __init__.py
│ ├── mod1.py
│ └── subpackage/
│ ├── __init__.py
│ └── mod2.py
└── script.py
Zum Importieren verwenden wir den relativen (from .subpackage import mod2) oder den absoluten Pfad (from mypackage.subpackage import mod2). Absolute Importe sind für große Projekte zu bevorzugen.
Wesentliche Merkmale:
__init__.py definiertMuss init.py in jedem Ordner vorhanden sein, den wir zu einem Paket machen wollen?
Ja, für Python unter 3.3; in modernen Python-Versionen (3.3+) gibt es "implizite" Namespace-Pakete, aber zur vollständigen Kompatibilität wird die Datei trotzdem empfohlen.
Was passiert, wenn man ein Paket und nicht ein Modul importiert?
Es wird nur der Code aus __init__.py dieses Pakets ausgeführt.
Was ist der Unterschied zwischen den Importen “from . import mod1” und “import mod1”?
from . import mod1 (relativer Import) funktioniert nur innerhalb des Pakets, während der absolute Import das Modul in sys.path sucht, was zu Namenskonflikten führen kann.
__init__.pyNegativer Fall: Module mit identischen Namen in verschiedenen Unterverzeichnissen ohne Verwendung absoluter Importe. Auf ein Modul wird von einem anderen Paket zugegriffen als geplant. Vorteile:
Positiver Fall:
Eindeutige Festlegung der absoluten Importe, korrekte Ordnerstruktur und Vorhandensein von __init__.py.
Vorteile: