Python-Module
Python-Module verstehen: eigene Module erstellen, Aliase verwenden, from-import nutzen, die Standardbibliothek erkunden und sys.path verstehen.
Ein Modul ist eine Datei mit Python-Code — Funktionen, Klassen und Variablen —, die Sie in mehreren Programmen wiederverwenden können. Module sind die grundlegende Einheit der Codeorganisation in Python: Statt Logik zwischen Dateien zu kopieren, schreiben Sie sie einmal, speichern sie als .py-Datei und importieren sie überall dort, wo Sie sie benötigen. Dieses Kapitel behandelt alles vom Erstellen Ihres ersten Moduls bis zur Navigation durch die Standardbibliothek und dem Verständnis, wie Python Module zur Laufzeit findet.
Was ist ein Python-Modul?
Jede .py-Datei ist ein Modul. Wenn Sie schreiben:
# greetings.py
def hello(name):
return f"Hello, {name}!"
def goodbye(name):
return f"Goodbye, {name}!"
PI = 3.14159haben Sie ein Modul namens greetings erstellt. Der Modulname ist der Dateiname ohne die Erweiterung .py.
Module können enthalten:
- Funktionen — wiederverwendbare Logikblöcke (siehe Python-Funktionen)
- Klassen — Vorlagen für Objekte (siehe Python-Klassen)
- Variablen und Konstanten — gemeinsam genutzte Daten
- Ausführbare Anweisungen — Code, der ausgeführt wird, wenn das Modul importiert oder direkt ausgeführt wird
Ein Modul importieren
Verwenden Sie die import-Anweisung gefolgt vom Modulnamen (ohne .py-Erweiterung).
import greetings
print(greetings.hello("Alice")) # Hello, Alice!
print(greetings.goodbye("Alice")) # Goodbye, Alice!
print(greetings.PI) # 3.14159Nach import greetings sind alle in greetings.py definierten Namen über das Präfix greetings. zugänglich. Diese Punktnotation verhindert Namenskonflikte — Ihre eigene Variable PI kann nicht mit greetings.PI kollidieren.
Bestimmte Namen mit from ... import importieren
Wenn Sie nur einen oder zwei Namen benötigen, importieren Sie diese direkt, sodass Sie sie ohne Modulpräfix verwenden können.
from greetings import hello, PI
print(hello("Bob")) # Hello, Bob!
print(PI) # 3.14159Alles mit * importieren
from greetings import *Dies zieht jeden öffentlichen Namen (die nicht mit _ beginnen) in den aktuellen Namespace. Vermeiden Sie dies in größeren Programmen: Es verschmutzt den Namespace und macht es schwer zu erkennen, woher ein Name stammt.
Import-Aliase mit as
Lange Modulnamen werden mühsam einzutippen. Verwenden Sie as, um einen kürzeren Alias zu erstellen.
import greetings as gr
print(gr.hello("Carol")) # Hello, Carol!Sie können auch einzelne importierte Namen mit einem Alias versehen:
from greetings import hello as hi
print(hi("Dave")) # Hello, Dave!Aliase sind besonders bei populären Bibliotheken verbreitet:
import numpy as np
import pandas as pd
import matplotlib.pyplot as pltDie Funktion dir()
dir(module) gibt eine sortierte Liste aller in einem Modul definierten Namen zurück — eine schnelle Möglichkeit, zu erkunden, was verfügbar ist.
import math
print(dir(math))
# ['__doc__', '__loader__', ..., 'acos', 'acosh', 'asin', ..., 'sqrt', 'tan', 'tanh', 'tau']Rufen Sie dir() ohne Argumente auf, um die Namen im aktuellen Gültigkeitsbereich zu sehen.
Die Variable __name__
Jedes Modul hat eine eingebaute Variable namens __name__. Wenn eine Datei importiert wird, wird __name__ auf den Modulnamen gesetzt. Wenn die Datei direkt ausgeführt wird, wird __name__ auf den string "__main__" gesetzt.
Dieses Muster ist die Standardmethode, um Code zu schreiben, der nur ausgeführt wird, wenn die Datei als Skript ausgeführt wird — nicht wenn sie als Bibliothek importiert wird:
# greetings.py
def hello(name):
return f"Hello, {name}!"
if __name__ == "__main__":
# This block only runs when you execute: python greetings.py
print(hello("World"))import greetings # The if-block does NOT run hereDieses Muster wird in fast jeder nicht-trivialen Python-Datei verwendet, auf die Sie stoßen werden.
Modul-Suchpfad (sys.path)
Wenn Sie import greetings schreiben, sucht Python nach dem Modul in einer Liste von Verzeichnissen, die in sys.path gespeichert sind:
- Das Verzeichnis des ausgeführten Skripts (oder das aktuelle Verzeichnis im interaktiven Modus)
- In der Umgebungsvariable
PYTHONPATHaufgelistete Verzeichnisse - Die Verzeichnisse der Standardbibliothek
- Das Verzeichnis
site-packages(wo von pip installierte Drittanbieter-Pakete liegen)
import sys
print(sys.path)
# ['/path/to/script', '/usr/lib/python3.11', ..., '/usr/lib/python3/dist-packages']Sie können zur Laufzeit einen Pfad hinzufügen, aber dies ist für gut strukturierte Projekte selten notwendig:
import sys
sys.path.append("/path/to/my/libs")Die Python-Standardbibliothek
Python wird mit einer umfangreichen Standardbibliothek geliefert — Hunderte von Modulen, die alles von Datei-I/O über Netzwerkprotokolle bis hin zur Datenkomprimierung abdecken. Sie müssen nichts installieren; importieren Sie sie einfach.
math — Mathematische Funktionen
import math
print(math.sqrt(16)) # 4.0
print(math.pi) # 3.141592653589793
print(math.factorial(5)) # 120
print(math.ceil(4.2)) # 5
print(math.floor(4.8)) # 4Siehe Python Math für eine vollständige Referenz.
random — Zufallszahlen
import random
print(random.randint(1, 10)) # random integer between 1 and 10
print(random.choice(["a", "b", "c"])) # random element
print(random.random()) # float in [0.0, 1.0)
numbers = [1, 2, 3, 4, 5]
random.shuffle(numbers)
print(numbers) # shuffled in placedatetime — Datum und Uhrzeit
import datetime
now = datetime.datetime.now()
print(now) # 2024-03-15 10:30:45.123456
print(now.year) # 2024
print(now.strftime("%B %d, %Y")) # March 15, 2024
today = datetime.date.today()
print(today) # 2024-03-15Siehe Python Dates für eine vollständige Abdeckung von Datumsarithmetik und -formatierung.
os und sys — Betriebssystem und Interpreter
import os
print(os.getcwd()) # current working directory
print(os.listdir(".")) # files in the current directory
os.makedirs("new_dir", exist_ok=True) # create a directory
print(os.path.join("folder", "file.txt")) # 'folder/file.txt'import sys
print(sys.version) # Python version string
print(sys.platform) # 'linux', 'darwin', 'win32', etc.
sys.exit(0) # terminate the program with exit code 0json — JSON-Kodierung und -Dekodierung
import json
data = {"name": "Alice", "age": 30, "active": True}
# Python → JSON string
json_string = json.dumps(data, indent=2)
print(json_string)
# JSON string → Python
parsed = json.loads(json_string)
print(parsed["name"]) # AliceSiehe Python JSON für dateibasiertes Lesen und Schreiben.
collections — Spezialisierte Datenstrukturen
from collections import Counter, defaultdict
# Count occurrences
words = ["apple", "banana", "apple", "cherry", "banana", "apple"]
counts = Counter(words)
print(counts) # Counter({'apple': 3, 'banana': 2, 'cherry': 1})
print(counts.most_common(2)) # [('apple', 3), ('banana', 2)]
# Dict with default values
scores = defaultdict(int)
scores["Alice"] += 10
scores["Bob"] += 5
print(dict(scores)) # {'Alice': 10, 'Bob': 5}Siehe Python Collections Module für namedtuple, deque und OrderedDict.
Ein eigenes Modul erstellen
Grundlegende Struktur
Module funktionieren am besten, wenn sie eine Sache gut erledigen. Eine gute Faustregel: Wenn eine Gruppe von Funktionen ein gemeinsames Thema hat, legen Sie sie in eine eigene Datei.
# mathutils.py
def clamp(value, minimum, maximum):
"""Restrict value to the range [minimum, maximum]."""
return max(minimum, min(value, maximum))
def average(numbers):
"""Return the arithmetic mean of a list of numbers."""
if not numbers:
raise ValueError("Cannot average an empty list")
return sum(numbers) / len(numbers)
def is_prime(n):
"""Return True if n is a prime number."""
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True# main.py
from mathutils import clamp, average, is_prime
print(clamp(15, 0, 10)) # 10
print(average([2, 4, 6, 8])) # 5.0
print(is_prime(17)) # TrueDocstrings in Modulen
Fügen Sie ganz oben in der Datei einen Docstring auf Modulebene hinzu. Tools wie help() und Dokumentationsgeneratoren verwenden ihn.
"""
mathutils.py — Utility functions for common mathematical operations.
Functions:
clamp(value, minimum, maximum) -> number
average(numbers) -> float
is_prime(n) -> bool
"""Modulvariablen: __all__
__all__ ist eine Liste von Namen, die exportiert werden sollen, wenn jemand from module import * ausführt. Sie dient auch als Dokumentation über die öffentliche API des Moduls.
# mathutils.py
__all__ = ["clamp", "average", "is_prime"]
def _helper(): # leading underscore marks it as private
passEin Modul neu laden
Python speichert importierte Module in sys.modules zwischen. Das zweimalige Importieren desselben Moduls führt es nicht erneut aus — Python gibt die zwischengespeicherte Version zurück. Während der interaktiven Entwicklung oder beim Debuggen können Sie ein Neuladen erzwingen:
import importlib
import greetings
importlib.reload(greetings)Dies wird hauptsächlich in REPL-Sitzungen oder Jupyter-Notebooks benötigt, nachdem eine Moduldatei bearbeitet wurde.
Häufige Fallstricke
Zirkuläre Importe
Wenn module_a module_b importiert und module_b module_a importiert, entsteht ein zirkulärer Import. Python kann einige zirkuläre Importe verarbeiten, aber sie sind verwirrend und deuten oft auf ein Designproblem hin. Die Lösung besteht normalerweise darin, den Code umzustrukturieren — die gemeinsame Logik in ein drittes Modul verschieben oder den Import in eine Funktion verlagern.
Eine Standardbibliothek verschatten
Wenn Sie Ihre Datei math.py, random.py oder json.py nennen, werden Sie das Standardbibliotheksmodul verschatten und jeden Code beschädigen, der es importiert. Verwenden Sie spezifische, beschreibende Namen für Ihre eigenen Module.
# BAD: naming your file math.py shadows the stdlib
# GOOD: name it mathutils.py or geometry.pyImportError und ModuleNotFoundError
ModuleNotFoundError (eine Unterklasse von ImportError) bedeutet, dass Python das Modul nirgendwo auf sys.path finden konnte. Häufige Ursachen:
- Ein Tippfehler im Modulnamen
- Das Modul ist nicht installiert (
pip install <package-name>) - Die Moduldatei befindet sich in einem Verzeichnis, das nicht auf
sys.pathsteht
try:
import nonexistent_module
except ModuleNotFoundError as e:
print(f"Import failed: {e}")
# Import failed: No module named 'nonexistent_module'Module vs. Pakete
Ein Modul ist eine einzelne .py-Datei. Ein Paket ist ein Verzeichnis, das mehrere Module und eine __init__.py-Datei enthält. Pakete ermöglichen den Aufbau größerer Bibliotheken mit einer hierarchischen Struktur. Siehe Python Packages für die vollständige Erläuterung.
Populäre Drittanbieter-Module
Über die Standardbibliothek hinaus hat das Python-Ökosystem auf PyPI Hunderttausende von Paketen. Installieren Sie sie mit pip.
| Paket | Zweck |
|---|---|
numpy | Numerisches Computing, mehrdimensionale Arrays |
pandas | Datenanalyse und -manipulation |
matplotlib | Datenvisualisierung und Diagrammerstellung |
requests | HTTP-Anfragen leicht gemacht |
flask / django | Web-Frameworks |
scikit-learn | Machine-Learning-Algorithmen |
pytest | Test-Framework |