Wie man eine __init__.py-Datei in einem Python-Paket richtig einrichtet

PythonPythonBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Die korrekte Einrichtung der Datei __init__.py ist ein entscheidender Schritt bei der Erstellung eines gut strukturierten Python-Pakets. Dieses Tutorial führt Sie durch das Verständnis des Zwecks von __init__.py, die Organisation Ihres Python-Pakets und die Konfiguration der Datei __init__.py, um Ihren Code wartbarer und wiederverwendbarer zu machen.

In diesem Lab erstellen Sie Schritt für Schritt ein einfaches Python-Paket und lernen, wie Sie die Datei __init__.py effektiv zur Strukturierung Ihres Codes verwenden. Am Ende dieses Labs werden Sie ein solides Verständnis der Python-Paketorganisation und der Best Practices haben.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python/FunctionsGroup -.-> python/function_definition("Function Definition") python/ModulesandPackagesGroup -.-> python/importing_modules("Importing Modules") python/ModulesandPackagesGroup -.-> python/creating_modules("Creating Modules") python/ModulesandPackagesGroup -.-> python/using_packages("Using Packages") subgraph Lab Skills python/function_definition -.-> lab-398237{{"Wie man eine __init__.py-Datei in einem Python-Paket richtig einrichtet"}} python/importing_modules -.-> lab-398237{{"Wie man eine __init__.py-Datei in einem Python-Paket richtig einrichtet"}} python/creating_modules -.-> lab-398237{{"Wie man eine __init__.py-Datei in einem Python-Paket richtig einrichtet"}} python/using_packages -.-> lab-398237{{"Wie man eine __init__.py-Datei in einem Python-Paket richtig einrichtet"}} end

Das Verständnis des Zwecks von __init__.py

In der Python-Programmierung dient die Datei __init__.py als Marker, der Python mitteilt, dass ein Verzeichnis als Paket behandelt werden soll. Diese Datei ermöglicht es Ihnen, zusammengehörigen Code in einem strukturierten und wiederverwendbaren Format zu organisieren.

Was ist ein Python-Paket?

Ein Python-Paket ist eine Sammlung von Python-Modulen (Dateien), die in einer Verzeichnisstruktur organisiert sind. Diese Organisation hilft Ihnen, zusammengehörigen Code zu gruppieren, wodurch die Verwaltung und Verteilung Ihrer Anwendung vereinfacht wird.

Beginnen wir mit der Erstellung einer einfachen Python-Paketstruktur:

  1. Öffnen Sie das Terminal in Ihrer WebIDE und navigieren Sie zum Projektverzeichnis:
cd ~/project
  1. Erstellen Sie ein neues Verzeichnis für unser Paket:
mkdir calculator_package
  1. Erstellen Sie eine leere Datei __init__.py innerhalb des Paketverzeichnisses:
touch calculator_package/__init__.py
  1. Überprüfen wir unsere anfängliche Paketstruktur:
ls -la calculator_package/

Sie sollten die folgende Ausgabe sehen:

total 8
drwxr-xr-x 2 labex labex 4096 ... .
drwxr-xr-x 3 labex labex 4096 ... ..
-rw-r--r-- 1 labex labex    0 ... __init__.py

An diesem Punkt ist die Datei __init__.py leer, aber sie dient als Marker, der Python mitteilt, dass das Verzeichnis calculator_package als Paket behandelt werden soll. In den nächsten Schritten werden wir untersuchen, wie Sie diese Datei konfigurieren können, um die Funktionalität unseres Pakets zu erweitern.

Testen des Basis-Pakets

Erstellen wir ein einfaches Testskript, um zu überprüfen, ob unser Paket importiert werden kann:

  1. Erstellen Sie in der WebIDE eine neue Datei namens test_package.py im Projektverzeichnis:

  2. Fügen Sie der Datei den folgenden Code hinzu:

import calculator_package

print("Successfully imported calculator_package!")
  1. Führen Sie das Testskript aus:
python3 test_package.py

Sie sollten die folgende Ausgabe sehen:

Successfully imported calculator_package!

Dies bestätigt, dass unsere grundlegende Paketstruktur korrekt eingerichtet ist. Selbst mit einer leeren Datei __init__.py erkennt Python das Verzeichnis als Paket und erlaubt uns, es zu importieren.

Erstellen von Modulen in Ihrem Paket

Nachdem wir die grundlegende Struktur unseres Python-Pakets eingerichtet haben, wollen wir nun einige tatsächliche Funktionalitäten hinzufügen, indem wir Module innerhalb unseres Pakets erstellen.

Hinzufügen von Modulen zu Ihrem Paket

Ein Modul ist einfach eine Python-Datei, die Funktionen, Klassen oder Variablen enthält. Erstellen wir ein paar Module für unser Taschenrechner-Paket:

  1. Erstellen Sie ein Modul für Additionsoperationen:
touch calculator_package/addition.py
  1. Öffnen Sie die Datei addition.py in der WebIDE und fügen Sie den folgenden Code hinzu:
def add_two_numbers(a, b):
    """Add two numbers and return the result."""
    return a + b

def add_multiple_numbers(*args):
    """Add multiple numbers and return the result."""
    return sum(args)
  1. Erstellen Sie nun ein Modul für Multiplikationsoperationen:
touch calculator_package/multiplication.py
  1. Öffnen Sie die Datei multiplication.py in der WebIDE und fügen Sie den folgenden Code hinzu:
def multiply_two_numbers(a, b):
    """Multiply two numbers and return the result."""
    return a * b

def multiply_multiple_numbers(*args):
    """Multiply multiple numbers and return the result."""
    result = 1
    for num in args:
        result *= num
    return result
  1. Überprüfen wir unsere aktualisierte Paketstruktur:
ls -la calculator_package/

Sie sollten die folgende Ausgabe sehen:

total 16
drwxr-xr-x 2 labex labex 4096 ... .
drwxr-xr-x 3 labex labex 4096 ... ..
-rw-r--r-- 1 labex labex    0 ... __init__.py
-rw-r--r-- 1 labex labex  xxx ... addition.py
-rw-r--r-- 1 labex labex  xxx ... multiplication.py

Testen einzelner Module

Erstellen wir ein Testskript, um zu überprüfen, ob unsere Module korrekt funktionieren:

  1. Erstellen Sie eine neue Datei namens test_modules.py im Projektverzeichnis:

  2. Fügen Sie der Datei den folgenden Code hinzu:

from calculator_package.addition import add_two_numbers
from calculator_package.multiplication import multiply_two_numbers

## Test addition
result1 = add_two_numbers(5, 3)
print(f"5 + 3 = {result1}")

## Test multiplication
result2 = multiply_two_numbers(5, 3)
print(f"5 * 3 = {result2}")
  1. Führen Sie das Testskript aus:
python3 test_modules.py

Sie sollten die folgende Ausgabe sehen:

5 + 3 = 8
5 * 3 = 15

Dies bestätigt, dass unsere Module korrekt funktionieren. Die aktuelle Import-Syntax (from calculator_package.addition import add_two_numbers) ist jedoch etwas umständlich. Im nächsten Schritt konfigurieren wir die Datei __init__.py, um das Importieren von Funktionen aus unserem Paket bequemer zu gestalten.

Konfigurieren der Datei __init__.py

Nachdem wir unsere Paketstruktur mit Modulen erstellt haben, ist es an der Zeit, die Datei __init__.py zu konfigurieren, um unser Paket benutzerfreundlicher zu gestalten. Die Datei __init__.py kann verwendet werden, um:

  1. Bestimmte Funktionen oder Klassen aus Modulen zu importieren
  2. Variablen auf Paketebene zu definieren
  3. Initialisierungsaufgaben auszuführen, wenn das Paket importiert wird

Funktionen auf Paketebene verfügbar machen

Konfigurieren wir unsere Datei __init__.py, um bestimmte Funktionen direkt von der Paketebene aus verfügbar zu machen:

  1. Öffnen Sie die Datei __init__.py in der WebIDE und fügen Sie den folgenden Code hinzu:
## Import functions from modules
from .addition import add_two_numbers, add_multiple_numbers
from .multiplication import multiply_two_numbers, multiply_multiple_numbers

## Define package-level variables
__version__ = "0.1.0"
__author__ = "Your Name"

## Print a message when the package is imported
print(f"Calculator Package v{__version__} initialized")

Diese Konfiguration tut mehrere wichtige Dinge:

  • Sie importiert bestimmte Funktionen aus unseren Modulen unter Verwendung relativer Imports (beachten Sie den Punkt vor dem Modulnamen)
  • Sie definiert Variablen auf Paketebene __version__ und __author__
  • Sie gibt eine Meldung aus, wenn das Paket importiert wird

Der wichtigste Vorteil ist, dass Benutzer die Funktionen jetzt direkt aus dem Paket importieren können, ohne die interne Modulstruktur kennen zu müssen.

Testen des konfigurierten Pakets

Erstellen wir eine neue Testdatei, um die verbesserte Import-Erfahrung zu demonstrieren:

  1. Erstellen Sie eine neue Datei namens test_configured_package.py im Projektverzeichnis:

  2. Fügen Sie der Datei den folgenden Code hinzu:

## Import functions directly from the package
from calculator_package import add_two_numbers, multiply_multiple_numbers
from calculator_package import __version__

## Display package version
print(f"Using Calculator Package version: {__version__}")

## Test addition function
result1 = add_two_numbers(10, 5)
print(f"10 + 5 = {result1}")

## Test multiplication function
result2 = multiply_multiple_numbers(2, 3, 4)
print(f"2 * 3 * 4 = {result2}")
  1. Führen Sie das Testskript aus:
python3 test_configured_package.py

Sie sollten die folgende Ausgabe sehen:

Calculator Package v0.1.0 initialized
Using Calculator Package version: 0.1.0
10 + 5 = 15
2 * 3 * 4 = 24

Beachten Sie, wie die Initialisierungsmeldung beim Import des Pakets ausgegeben wird und die Paketversion über die Variable __version__ zugänglich ist. Am wichtigsten ist, dass wir jetzt Funktionen direkt aus dem Paket importieren können, ohne die Module anzugeben, aus denen sie stammen.

Zusätzliche Techniken zur Paketorganisation

Für größere Projekte möchten Sie möglicherweise Ihr Paket mit Unterpaketen organisieren. Erstellen wir ein einfaches Unterpaket, um dies zu demonstrieren:

  1. Erstellen Sie ein Unterpaketverzeichnis für erweiterte Operationen:
mkdir calculator_package/advanced
  1. Erstellen Sie eine Datei __init__.py für das Unterpaket:
touch calculator_package/advanced/__init__.py
  1. Erstellen Sie ein Modul im Unterpaket:
touch calculator_package/advanced/scientific.py
  1. Öffnen Sie die Datei scientific.py in der WebIDE und fügen Sie den folgenden Code hinzu:
import math

def square_root(x):
    """Calculate the square root of a number."""
    return math.sqrt(x)

def power(x, y):
    """Calculate x raised to the power of y."""
    return math.pow(x, y)
  1. Konfigurieren Sie die Datei __init__.py des Unterpakets:

Öffnen Sie die Datei calculator_package/advanced/__init__.py und fügen Sie Folgendes hinzu:

from .scientific import square_root, power

print("Advanced calculator functions loaded")
  1. Aktualisieren Sie die Datei __init__.py des Hauptpakets, um das Unterpaket einzubeziehen:

Fügen Sie diese Zeile am Ende von calculator_package/__init__.py hinzu:

## Import the advanced subpackage
from . import advanced
  1. Testen Sie das Unterpaket:

Erstellen Sie eine neue Datei test_subpackage.py im Projektverzeichnis:

from calculator_package.advanced import square_root, power

## Test square root
result1 = square_root(16)
print(f"Square root of 16 = {result1}")

## Test power
result2 = power(2, 3)
print(f"2 raised to the power of 3 = {result2}")
  1. Führen Sie den Test aus:
python3 test_subpackage.py

Sie sollten Folgendes sehen:

Calculator Package v0.1.0 initialized
Advanced calculator functions loaded
Square root of 16 = 4.0
2 raised to the power of 3 = 8.0

Dies zeigt, wie Sie Unterpakete verwenden können, um komplexere Python-Pakete zu organisieren.

Erstellen einer vollständigen Paketstruktur

Nachdem wir die Grundprinzipien von Python-Paketen und die Rolle der Datei __init__.py verstanden haben, erstellen wir eine umfassendere Paketstruktur, die den Best Practices folgt. Dies hilft Ihnen, größere Projekte effektiv zu organisieren.

Best Practices für die Paketstruktur

Ein gut organisiertes Python-Paket folgt typischerweise dieser Struktur:

package_name/
├── __init__.py
├── module1.py
├── module2.py
├── subpackage1/
│   ├── __init__.py
│   └── module3.py
├── subpackage2/
│   ├── __init__.py
│   └── module4.py
├── README.md
├── setup.py
└── tests/
    ├── __init__.py
    ├── test_module1.py
    └── test_module2.py

Implementieren wir eine vereinfachte Version dieser Struktur für unser Taschenrechner-Paket:

  1. Erstellen Sie eine Datei README.md:
touch ~/project/calculator_package/README.md
  1. Öffnen Sie die Datei README.md in der WebIDE und fügen Sie Folgendes hinzu:

Calculator Package

A simple Python package that provides basic and advanced calculator functions.

Features

  • Basic arithmetic operations (addition, multiplication)
  • Advanced scientific operations (square root, power)

Usage

from calculator_package import add_two_numbers, multiply_two_numbers
from calculator_package.advanced import square_root, power

## Basic operations
result1 = add_two_numbers(5, 3)
result2 = multiply_two_numbers(4, 2)

## Advanced operations
result3 = square_root(16)
result4 = power(2, 3)
  1. Erstellen Sie ein Verzeichnis "tests":
mkdir ~/project/calculator_package/tests
touch ~/project/calculator_package/tests/__init__.py
  1. Erstellen Sie Testdateien:
touch ~/project/calculator_package/tests/test_basic.py
  1. Öffnen Sie test_basic.py in der WebIDE und fügen Sie Folgendes hinzu:
import unittest
from calculator_package import add_two_numbers, multiply_two_numbers

class TestBasicOperations(unittest.TestCase):

    def test_addition(self):
        self.assertEqual(add_two_numbers(5, 3), 8)
        self.assertEqual(add_two_numbers(-1, 1), 0)

    def test_multiplication(self):
        self.assertEqual(multiply_two_numbers(5, 3), 15)
        self.assertEqual(multiply_two_numbers(-2, 3), -6)

if __name__ == '__main__':
    unittest.main()
  1. Erstellen Sie eine Datei setup.py für die Paketverteilung:
touch ~/project/setup.py
  1. Öffnen Sie setup.py in der WebIDE und fügen Sie Folgendes hinzu:
from setuptools import setup, find_packages

setup(
    name="calculator_package",
    version="0.1.0",
    author="Your Name",
    author_email="[email protected]",
    description="A simple calculator package",
    packages=find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires=">=3.6",
)
  1. Führen wir die Unit-Tests aus:
cd ~/project
python3 -m calculator_package.tests.test_basic

Sie sollten eine ähnliche Ausgabe sehen wie:

Calculator Package v0.1.0 initialized
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

Dies bestätigt, dass unser Paket gut strukturiert ist und die Tests korrekt funktionieren.

Paketdokumentation mit Docstrings

Eine gute Dokumentation ist für jedes Python-Paket unerlässlich. Fügen wir unserem Paket ordnungsgemäße Docstrings hinzu:

  1. Aktualisieren Sie die Datei calculator_package/__init__.py, um einen Docstring auf Paketebene einzuschließen:
"""
Calculator Package - A collection of calculator functions.

This package provides various calculator functions including basic
arithmetic operations and advanced scientific operations.
"""

## Import functions from modules
from .addition import add_two_numbers, add_multiple_numbers
from .multiplication import multiply_two_numbers, multiply_multiple_numbers

## Define package-level variables
__version__ = "0.1.0"
__author__ = "Your Name"

## Print a message when the package is imported
print(f"Calculator Package v{__version__} initialized")

## Import the advanced subpackage
from . import advanced
  1. Sie können den Docstring mit der Python-Hilfefunktion anzeigen:
cd ~/project
python3 -c "import calculator_package; help(calculator_package)"

Dies sollte die Paketdokumentation anzeigen:

Help on package calculator_package:

NAME
    calculator_package - Calculator Package - A collection of calculator functions.

DESCRIPTION
    This package provides various calculator functions including basic
    arithmetic operations and advanced scientific operations.

PACKAGE CONTENTS
    addition
    advanced (package)
    multiplication
    tests (package)

DATA
    __author__ = 'Your Name'
    __version__ = '0.1.0'

FILE
    /home/labex/project/calculator_package/__init__.py

Diese Dokumentation hilft Benutzern, den Zweck und die Fähigkeiten Ihres Pakets zu verstehen.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie man ein Python-Paket mit __init__.py-Dateien richtig einrichtet und konfiguriert. Sie verstehen jetzt:

  • Den Zweck der Datei __init__.py als Paketmarker und Konfigurationsdatei
  • Wie man Module innerhalb eines Pakets organisiert
  • Wie man Funktionen und Klassen auf Paketebene verfügbar macht
  • Wie man Paketmetadaten und Initialisierungscode einfügt
  • Wie man ein vollständiges Python-Paket mit Unterpaketen, Tests und Dokumentation strukturiert

Diese Fähigkeiten helfen Ihnen, gut organisierten, wartbaren und wiederverwendbaren Python-Code zu erstellen. Mit zunehmender Komplexität Ihrer Projekte wird eine ordnungsgemäße Paketstruktur immer wichtiger für die Verwaltung von Code und die Zusammenarbeit mit anderen Entwicklern.

Sie können diese Konzepte jetzt auf Ihre eigenen Python-Projekte anwenden, um sie modularer und professioneller zu gestalten.