Einführung
In diesem Lab lernen Sie, wie Sie ein Python-Paket erstellen und organisieren. Python-Pakete sind eine ausgezeichnete Möglichkeit, Ihren Code zu strukturieren, um ihn modularer, wiederverwendbarer und wartbarer zu machen.
Die Ziele dieses Labs sind es, zu verstehen, was ein Python-Paket ist, eine grundlegende Paketstruktur zu erstellen, verwandte Python-Module zu einem zusammenhängenden Paket zu organisieren und die Import-Anweisungen so zu aktualisieren, dass sie mit der neuen Paketstruktur funktionieren.
Python-Pakete verstehen
Bevor wir mit der Erstellung eines Python-Pakets beginnen, lernen wir zunächst, was ein Python-Paket ist. Ein Python-Paket ist im Wesentlichen ein Verzeichnis. Innerhalb dieses Verzeichnisses befinden sich mehrere Python-Moduldateien, die einfach .py-Dateien mit Python-Code sind. Zusätzlich gibt es eine spezielle Datei namens __init__.py. Diese Datei kann leer sein, aber ihre Existenz zeigt an, dass das Verzeichnis ein Python-Paket ist. Das Ziel dieser Struktur ist es, Ihnen zu helfen, verwandten Code in einer einzigen Verzeichnis-Hierarchie zu organisieren.
Pakete bieten mehrere Vorteile. Erstens ermöglichen sie es Ihnen, Ihren Code logisch zu strukturieren. Anstatt alle Ihre Python-Dateien überall verteilt zu haben, können Sie verwandte Funktionen in einem Paket zusammenfassen. Zweitens helfen sie dabei, Namenskonflikte zwischen Modulen zu vermeiden. Da Pakete einen Namensraum (namespace) erstellen, können Sie Module mit demselben Namen in verschiedenen Paketen haben, ohne dass es Probleme gibt. Drittens machen sie das Importieren und Verwenden Ihres Codes bequemer. Sie können ganz einfach ein gesamtes Paket oder bestimmte Module daraus importieren.
Nun schauen wir uns die Dateien an, die sich derzeit in unserem Projektverzeichnis befinden. Um die Dateien aufzulisten, verwenden wir den folgenden Befehl im Terminal:
ls -l
Wenn Sie diesen Befehl ausführen, sollten Sie die folgenden Dateien sehen:
portfolio.csv
reader.py
stock.py
structure.py
tableformat.py
validate.py
Diese Python-Dateien sind alle verwandt und arbeiten zusammen, aber derzeit sind es nur separate Module. In diesem Lab ist unser Ziel, sie zu einem zusammenhängenden Paket namens structly zu organisieren.
Lassen Sie uns kurz verstehen, was jede Datei macht:
structure.py: Diese Datei definiert eine BasisklasseStructureund verschiedene Deskriptoren (descriptors). Diese Deskriptoren werden zur Typüberprüfung (type validation) verwendet, was bedeutet, dass sie helfen, sicherzustellen, dass die im Programm verwendeten Daten den richtigen Typ haben.validate.py: Sie enthält Validierungsfunktionen, die vomstructure-Modul verwendet werden. Dies hilft bei der Überprüfung der Daten gemäß bestimmten Regeln.reader.py: Diese Datei bietet Funktionen, die zum Lesen von CSV-Daten verwendet werden. CSV (Comma-Separated Values) ist ein gängiges Dateiformat zum Speichern tabellarischer Daten.tableformat.py: Sie enthält Klassen und Funktionen, die zum Formatieren von Daten in Tabellen verwendet werden. Dies ist nützlich, wenn Sie Daten auf eine organisiertere Weise anzeigen möchten.stock.py: Diese Datei verwendet die anderen Module, um eineStock-Klasse zu definieren und Aktiendaten zu verarbeiten. Sie kombiniert die Funktionen der anderen Module, um bestimmte Aufgaben im Zusammenhang mit Aktiendaten auszuführen.
Im nächsten Schritt erstellen wir unsere Paketstruktur.
Erstellen der Paketstruktur
Jetzt werden wir unser Python-Paket erstellen. Aber zuerst verstehen wir, was ein Python-Paket ist. Ein Python-Paket ist eine Möglichkeit, verwandte Python-Module in einer einzigen Verzeichnis-Hierarchie zu organisieren. Es hilft, Code effektiver zu verwalten und wiederzuverwenden. Um ein Python-Paket zu erstellen, müssen wir die folgenden Schritte befolgen:
- Erstellen Sie ein Verzeichnis mit dem Paketnamen. Dieses Verzeichnis dient als Container für alle Module, die zum Paket gehören.
- Erstellen Sie eine
__init__.py-Datei innerhalb dieses Verzeichnisses. Diese Datei ist wichtig, da sie Python dazu bringt, das Verzeichnis als Paket zu erkennen. Wenn Sie das Paket importieren, wird der Code in__init__.pyausgeführt, der verwendet werden kann, um das Paket zu initialisieren. - Verschieben Sie unsere Python-Moduldateien in dieses Verzeichnis. Dieser Schritt stellt sicher, dass all der verwandte Code innerhalb des Pakets zusammengefasst wird.
Lassen Sie uns die Paketstruktur Schritt für Schritt erstellen:
- Zuerst erstellen Sie ein Verzeichnis namens
structly. Dies wird das Root-Verzeichnis unseres Pakets sein.
mkdir structly
- Erstellen Sie als Nächstes eine leere
__init__.py-Datei innerhalb desstructly-Verzeichnisses.
touch structly/__init__.py
Die __init__.py-Datei kann leer sein, aber sie ist erforderlich, damit Python das Verzeichnis als Paket behandelt. Wenn Sie das Paket importieren, wird der Code in __init__.py ausgeführt, der verwendet werden kann, um das Paket zu initialisieren.
- Jetzt verschieben wir unsere Python-Moduldateien in das
structly-Verzeichnis. Diese Moduldateien enthalten die Funktionen und Klassen, die wir in unser Paket aufnehmen möchten.
mv structure.py validate.py reader.py tableformat.py structly/
- Überprüfen Sie, ob alle Dateien korrekt verschoben wurden. Wir können den Befehl
ls -lverwenden, um den Inhalt desstructly-Verzeichnisses aufzulisten.
ls -l structly/
Sie sollten die folgenden Dateien aufgelistet sehen:
__init__.py
reader.py
structure.py
tableformat.py
validate.py
Jetzt haben wir eine grundlegende Paketstruktur erstellt. Die Verzeichnis-Hierarchie sollte wie folgt aussehen:
project/
├── portfolio.csv
├── stock.py
└── structly/
├── __init__.py
├── reader.py
├── structure.py
├── tableformat.py
└── validate.py
Im nächsten Schritt werden wir die Import-Anweisungen korrigieren, damit das Paket richtig funktioniert.
Import-Anweisungen korrigieren
Lassen Sie uns nun verstehen, warum wir dies tun müssen. Als wir unsere Dateien in das structly-Paket verschoben haben, hat sich die Art und Weise, wie Python nach Modulen sucht, geändert. Die Import-Anweisungen in jeder Datei müssen aktualisiert werden, um die neue Paketstruktur abzugleichen. Dies ist entscheidend, da Python diese Import-Anweisungen verwendet, um Code aus anderen Modulen zu finden und zu nutzen.
Die Datei structure.py ist sehr wichtig zu aktualisieren. Sie importiert Funktionen und Klassen aus der Datei validate.py. Da sich beide Dateien nun im selben structly-Paket befinden, müssen wir die Import-Anweisung entsprechend anpassen.
Beginnen wir damit, die Datei structly/structure.py im Editor zu öffnen. Sie können entweder in der Dateiexplorer auf structly/structure.py klicken oder den folgenden Befehl im Terminal ausführen:
## Klicken Sie in der Dateiexplorer auf structly/structure.py oder führen Sie aus:
code structly/structure.py
Sobald die Datei geöffnet ist, schauen Sie sich die erste Zeile der Import-Anweisung an. Sie sieht derzeit so aus:
from validate import validate_type
Diese Anweisung war korrekt, als sich die Dateien in einer anderen Struktur befanden. Aber jetzt müssen wir sie ändern, um Python mitzuteilen, dass es im selben Paket nach dem validate-Modul suchen soll. Daher ändern wir sie zu:
from .validate import validate_type
Der Punkt (.) vor validate ist hier ein wichtiger Bestandteil. Es handelt sich um eine spezielle Syntax in Python, die als relativer Import bezeichnet wird. Sie teilt Python mit, im selben Paket wie das aktuelle Modul (in diesem Fall structure.py) nach dem validate-Modul zu suchen.
Stellen Sie nach dieser Änderung sicher, dass Sie die Datei speichern. Das Speichern ist wichtig, da es die Änderungen dauerhaft macht und Python die aktualisierte Import-Anweisung verwendet, wenn Sie Ihren Code ausführen.
Überprüfen wir nun unsere anderen Dateien, um zu sehen, ob sie Aktualisierungen benötigen.
structly/reader.py- Diese Datei importiert keine unserer benutzerdefinierten Module. Das bedeutet, dass wir keine Änderungen daran vornehmen müssen.structly/tableformat.py- Ähnlich wie die Dateireader.pyimportiert auch diese keine unserer benutzerdefinierten Module. Daher sind hier ebenfalls keine Änderungen erforderlich.structly/validate.py- Genau wie die beiden vorherigen Dateien importiert sie keine unserer benutzerdefinierten Module. Daher müssen wir sie nicht ändern.
In der realen Programmierung können Ihre Projekte komplexere Beziehungen zwischen Modulen aufweisen. Wenn Sie Dateien verschieben, um eine Paketstruktur zu erstellen oder zu ändern, denken Sie immer daran, die Import-Anweisungen zu aktualisieren. Dies stellt sicher, dass Ihr Code die notwendigen Module korrekt finden und verwenden kann.
Aktualisieren und Testen des stock.py-Programms
Nachdem wir unser Paket erstellt und die internen Importe korrigiert haben, ist es an der Zeit, die stock.py-Datei zu aktualisieren, um unsere neue Paketstruktur zu nutzen. Ein Paket in Python ist eine Möglichkeit, verwandte Module zusammen zu organisieren. Es hilft, Ihre Codebasis organisiert zu halten und erleichtert die Verwaltung und Wiederverwendung von Code.
Öffnen Sie die stock.py-Datei im Editor:
## Click on stock.py in the file explorer or run:
code stock.py
Die aktuellen Importe in stock.py basieren auf der alten Struktur, in der alle Dateien im gleichen Verzeichnis lagen. In Python sucht Python bei einem Modulimport an bestimmten Orten nach dem Modul. In der alten Struktur konnte Python die Module leicht finden, da alle Dateien im gleichen Verzeichnis waren. Aber jetzt, mit der neuen Paketstruktur, müssen wir die Importe aktualisieren, um Python zu sagen, wo es die Module innerhalb des structly-Pakets finden kann.
Aktualisieren Sie die stock.py-Datei so, dass sie genau wie folgt aussieht:
## stock.py
from structly.structure import Structure, String, PositiveInteger, PositiveFloat
class Stock(Structure):
name = String()
shares = PositiveInteger()
price = PositiveFloat()
@property
def cost(self):
return self.shares * self.price
def sell(self, nshares: PositiveInteger):
self.shares -= nshares
if __name__ == '__main__':
from structly.reader import read_csv_as_instances
from structly.tableformat import create_formatter, print_table
portfolio = read_csv_as_instances('portfolio.csv', Stock)
formatter = create_formatter('text')
print_table(portfolio, ['name','shares','price'], formatter)
Die wichtigsten Änderungen sind:
- Geändert von
from structure import Structure, String, PositiveInteger, PositiveFloatzufrom structly.structure import Structure, String, PositiveInteger, PositiveFloat. Diese Änderung sagt Python, dass es nach demstructure-Modul innerhalb desstructly-Pakets suchen soll. - Geändert von
from reader import read_csv_as_instanceszufrom structly.reader import read_csv_as_instances. Ebenso leitet diese Änderung Python an, dasreader-Modul innerhalb desstructly-Pakets zu finden. - Geändert von
from tableformat import create_formatter, print_tablezufrom structly.tableformat import create_formatter, print_table. Dies stellt sicher, dass Python dastableformat-Modul imstructly-Paket findet.
Speichern Sie die Datei nach diesen Änderungen. Das Speichern der Datei ist wichtig, da es sicherstellt, dass die von Ihnen vorgenommenen Änderungen gespeichert werden und beim Ausführen des Programms verwendet werden können.
Jetzt testen wir unseren aktualisierten Code, um sicherzustellen, dass alles korrekt funktioniert:
python stock.py
Sie sollten die folgende Ausgabe sehen:
name shares price
---------- ---------- ----------
MSFT 100 51.23
IBM 50 91.1
AAPL 75 145.89
ACME 125 123.45
HPE 75 32.2
Wenn Sie diese Ausgabe sehen, herzlichen Glückwunsch! Sie haben erfolgreich ein Python-Paket erstellt und Ihren Code aktualisiert, um es zu nutzen. Dies bedeutet, dass Ihr Code jetzt auf eine modularere Weise organisiert ist, was die Wartung und Erweiterung in Zukunft erleichtert.
Zusammenfassung
In diesem Lab haben Sie gelernt, wie Sie ein Python-Paket erstellen und strukturieren. Insbesondere haben Sie das Konzept und die Nützlichkeit von Python-Paketen für die Codeorganisation verstanden, eine grundlegende Paketstruktur erstellt, Python-Module in sie verschoben, Import-Anweisungen aktualisiert und den Code so geändert, dass er das Paket korrekt nutzt.
Diese Fähigkeiten sind für die Entwicklung größerer Python-Anwendungen von entscheidender Bedeutung, da die ordnungsgemäße Codeorganisation immer wichtiger wird. Python-Pakete helfen, verwandten Code zusammenzuhalten, Namenskonflikte zu vermeiden und Ihren Code wiederverwendbarer, wartbarer und teilerfreundlicher zu machen. Gut strukturierte Pakete sind ein Eckpfeiler der professionellen Python-Entwicklung, wenn Sie Ihre Python-Reise fortsetzen.