Ein Python-Paket erstellen

Beginner

This tutorial is from open-source community. Access the source code

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.

Dies ist ein Guided Lab, das schrittweise Anweisungen bietet, um Ihnen beim Lernen und Üben zu helfen. Befolgen Sie die Anweisungen sorgfältig, um jeden Schritt abzuschließen und praktische Erfahrungen zu sammeln. Historische Daten zeigen, dass dies ein Labor der Stufe Fortgeschrittener mit einer Abschlussquote von 67% ist. Es hat eine positive Bewertungsrate von 100% von den Lernenden erhalten.

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 Basisklasse Structure und 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 vom structure-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 eine Stock-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:

  1. Erstellen Sie ein Verzeichnis mit dem Paketnamen. Dieses Verzeichnis dient als Container für alle Module, die zum Paket gehören.
  2. 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__.py ausgeführt, der verwendet werden kann, um das Paket zu initialisieren.
  3. 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:

  1. Zuerst erstellen Sie ein Verzeichnis namens structly. Dies wird das Root-Verzeichnis unseres Pakets sein.
mkdir structly
  1. Erstellen Sie als Nächstes eine leere __init__.py-Datei innerhalb des structly-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.

  1. 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/
  1. Überprüfen Sie, ob alle Dateien korrekt verschoben wurden. Wir können den Befehl ls -l verwenden, um den Inhalt des structly-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.

  1. structly/reader.py - Diese Datei importiert keine unserer benutzerdefinierten Module. Das bedeutet, dass wir keine Änderungen daran vornehmen müssen.
  2. structly/tableformat.py - Ähnlich wie die Datei reader.py importiert auch diese keine unserer benutzerdefinierten Module. Daher sind hier ebenfalls keine Änderungen erforderlich.
  3. 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:

  1. Geändert von from structure import Structure, String, PositiveInteger, PositiveFloat zu from structly.structure import Structure, String, PositiveInteger, PositiveFloat. Diese Änderung sagt Python, dass es nach dem structure-Modul innerhalb des structly-Pakets suchen soll.
  2. Geändert von from reader import read_csv_as_instances zu from structly.reader import read_csv_as_instances. Ebenso leitet diese Änderung Python an, das reader-Modul innerhalb des structly-Pakets zu finden.
  3. Geändert von from tableformat import create_formatter, print_table zu from structly.tableformat import create_formatter, print_table. Dies stellt sicher, dass Python das tableformat-Modul im structly-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.