Verschachtelte Module

Wir haben gesehen, wie Python-Skripte und -Programme beträchtliche Größen erreichen können. Um die Komplexität zu bewältigen und unseren Code sauber und lesbar zu halten, können wir unser Programm mit Modulen und Paketen strukturieren. In Python ist ein Modul einfach eine Datei, die Python-Code enthält. Module können andere Module importieren, was zu verschachtelten Modulen führen kann. Pakete hingegen sind eine Möglichkeit, verwandte Module in einer Verzeichnis-Hierarchie zu organisieren.
Angenommen, Sie entwickeln ein Spiel und verfügen über verschiedene Funktionalitäten wie sound, level, character usw., die jeweils in eigene Module aufgeteilt sind. Das sound-Modul selbst hat wiederum verschiedene Komponenten, zum Beispiel effects, filters, echo und so weiter. In einem solchen Szenario können Sie ein verschachteltes Modul erstellen. Schauen wir uns an, wie das geht:
Zunächst erstellen wir ein Verzeichnis für unser Paket. Beispielsweise könnten wir es game nennen:
game/                     # Das Verzeichnis unseres Spiel-Pakets
Im Verzeichnis game erstellen wir das Unterverzeichnis sound und eine leere __init__.py-Datei. Die Datei __init__.py ist erforderlich, damit Python die Verzeichnisse als Pakete behandelt.
game/
    sound/                # Unterverzeichnis für das 'sound'-Modul
        __init__.py       # Veranlasst Python, 'sound' als Paket zu behandeln
Nun können wir innerhalb des sound-Verzeichnisses verschiedene Python-Dateien für effects, filters und echo erstellen. Jede dieser Dateien repräsentiert ein Untermodul des sound-Moduls.
game/
    sound/
        __init__.py
        effects.py        # Das 'effects'-Untermodul
        filters.py        # Das 'filters'-Untermodul
        echo.py           # Das 'echo'-Untermodul
Angenommen, effects.py sieht folgendermaßen aus:
def echo_filter(soundwave):
    return soundwave + '...'   # Fügt der Klangwelle einen Echo hinzu

def distort_filter(soundwave):
    return soundwave[::-1]     # Kehrt die Klangwelle zur Verzerrung um
Wenn wir diese Funktionen in einem anderen Modul innerhalb unseres game-Pakets verwenden möchten, können wir sie importieren. Wir verwenden einen Punkt (.) zur Navigation durch das Paket. Hier ist ein Beispiel in einer hypothetischen Datei gameplay.py:
from game.sound.effects import echo_filter, distort_filter   # Import der Funktionen

soundwave = 'pew pew'
echoed = echo_filter(soundwave)
distorted = distort_filter(soundwave)

print(echoed, type(echoed))         # Gibt 'pew pew...', <class 'str'> aus
print(distorted, type(distorted))   # Gibt 'wep wep', <class 'str'> aus
Denken Sie daran, dass die Organisation Ihres Python-Codes in Module und Pakete dazu beitragen kann, ihn sauber und lesbar zu halten, sowie die Wartung und Weiterentwicklung zu erleichtern.

Die Rolle von init.py in Python-Paketen

In Python erfüllt die Datei __init__.py eine besondere Funktion für Verzeichnisse, die Sie als Python-Pakete nutzen möchten. Traditionell war eine __init__.py-Datei erforderlich, damit Python ein Verzeichnis als Paket erkennt, das Module enthält. In neueren Versionen von Python (ab 3.3) ist dies dank der Einführung von impliziten Namespace-Paketen nicht mehr zwingend erforderlich.
Dennoch sind __init__.py-Dateien keineswegs überholt und behalten in bestimmten Situationen ihren Nutzen. Sie können beispielsweise verwendet werden, um Initialisierungscode für das Paket auszuführen, die Importe mit der Variablen __all__ zu steuern oder praktische Importe zu definieren. Betrachten Sie diese Verzeichnisstruktur:
game/
    __init__.py
    sound/
        __init__.py
        effects.py
        filters.py
        echo.py
In game/sound/__init__.py könnten wir Folgendes haben:
from .effects import echo_filter
from .filters import distort_filter
from .echo import echo_sound
Hier importieren wir die Untermodule in der __init__.py-Datei. Nun können die Untermodule effects, filters und echo direkt zugegriffen werden, wenn wir sound importieren. Also könnten Sie in einem anderen Teil des Programms Folgendes tun:
from game.sound import echo_filter, distort_filter

soundwave = 'pew pew'
echoed = echo_filter(soundwave)
distorted = distort_filter(soundwave)
In diesem Beispiel spielt __init__.py eine entscheidende Rolle bei der Konsolidierung verschiedener Untermodule und bietet eine vereinfachte Schnittstelle zum Importieren von Funktionalitäten. Auch wenn neuere Python-Versionen das Vorhandensein von __init__.py nicht erzwingen, kann die Verwendung auf diese Weise Ihre Pakete benutzerfreundlicher und leichter verwaltbar machen.
 
To check your solution you need to sign in
Sign in to continue