Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einleitung
2 Überblick über Python
3 Die Arbeit mit Python
4 Der interaktive Modus
5 Grundlegendes zu Python-Programmen
6 Kontrollstrukturen
7 Das Laufzeitmodell
8 Basisdatentypen
9 Benutzerinteraktion und Dateizugriff
10 Funktionen
11 Modularisierung
12 Objektorientierung
13 Weitere Spracheigenschaften
14 Mathematik
15 Strings
16 Datum und Zeit
17 Schnittstelle zum Betriebssystem
18 Parallele Programmierung
19 Datenspeicherung
20 Netzwerkkommunikation
21 Debugging
22 Distribution von Python-Projekten
23 Optimierung
24 Grafische Benutzeroberflächen
25 Python als serverseitige Programmiersprache im WWW mit Django
26 Anbindung an andere Programmiersprachen
27 Insiderwissen
28 Zukunft von Python
A Anhang
Stichwort

Download:
- ZIP, ca. 4,8 MB
Buch bestellen
Ihre Meinung?

Spacer
 <<   zurück
Python von Peter Kaiser, Johannes Ernesti
Das umfassende Handbuch - Aktuell zu Python 2.5
Buch: Python

Python
gebunden, mit CD
819 S., 39,90 Euro
Galileo Computing
ISBN 978-3-8362-1110-9
Pfeil 11 Modularisierung
  Pfeil 11.1 Einbinden externer Programmbibliotheken
  Pfeil 11.2 Eigene Module
    Pfeil 11.2.1 Modulinterne Referenzen
  Pfeil 11.3 Pakete
    Pfeil 11.3.1 Importieren aller Module eines Pakets
    Pfeil 11.3.2 Relative Importanweisungen
  Pfeil 11.4 Built-in Functions


Galileo Computing - Zum Seitenanfang

11.3 Pakete  Zur nächsten ÜberschriftZur vorigen Überschrift

Python ermöglicht es Ihnen, mehrere Module in einem sogenannten Paket zu kapseln. Das ist vorteilhaft, wenn diese Module thematisch zusammengehören. Ein Paket kann, im Gegensatz zu einem einzelnen Modul, beliebig viele weitere Pakete enthalten, die ihrerseits wieder Module bzw. Pakete enthalten können.

Um ein Paket zu erstellen, muss im Wesentlichen ein Unterordner im Programmverzeichnis erzeugt werden. Der Name des Ordners entspricht dem Namen des Pakets. Zusätzlich muss in diesem Ordner eine Programmdatei namens __init__.py existieren. (Beachten Sie, dass es sich um jeweils zwei Unterstriche vor und hinter »init« handelt.) Diese Datei darf leer, muss aber vorhanden sein und enthält Initialisierungscode, der beim Einbinden des Paketes einmalig ausgeführt wird. Ein Programm mit mehreren Paketen und Unterpaketen hat also eine solche oder ähnliche Verzeichnisstruktur, wie Sie in Abbildung 11.1 sehen.

Abbildung 11.1  Paketstruktur eines Beispielprogramms

Im weiteren Verlauf des Kapitels werden wir immer wieder auf dieses Beispiel zurückkommen, deswegen soll es hier kurz besprochen werden. Es handelt sich um die Verzeichnisstruktur eines fiktiven Bildbearbeitungsprogramms. Das Hauptprogramm befindet sich in der Datei programm.py. Neben dem Hauptprogramm existieren im Programmverzeichnis zwei Pakete:

  • Das Paket effekte soll bestimmte Effekte auf ein bereits geladenes Bild anwenden können. Dazu enthält das Paket neben der Datei __init__.py drei Module, die jeweils einen grundlegenden Effekt durchführen sollen. Es handelt sich um die Module blur (zum Verwischen des Bildes), flip (zum Spiegeln des Bildes) und rotate (zum Drehen des Bildes).
  • Das Paket formate soll dazu in der Lage sein, bestimmte Grafikformate zu lesen und schreiben. Dazu definiert es in seiner __init__.py zwei Funktionen namens leseBild und schreibeBild. Wir möchten nicht näher auf Funktionsschnittstellen oder Ähnliches eingehen, sondern relativ abstrakt bleiben. Damit das Lesen und Schreiben von Grafiken diverser Formate möglich ist, enthält das Paket formate zwei Unterpakete namens bmp und png, die je zwei Module zum Lesen bzw. Schreiben des entsprechenden Formats enthalten.

Im Hauptprogramm sollen zunächst die Pakete effekte und formate eingebunden und verwendet werden. Dies ermöglicht die import-Anweisung:

import effekte, formate

bzw:

import effekte 
import formate

Beachten Sie, dass es zu einem Namenskonflikt kommt, wenn beispielsweise neben dem Paket effekte ein Modul gleichen Namens, also eine Programmdatei namens effekte.py, existiert. Es ist grundsätzlich so, dass bei Namensgleichheit ein Paket Vorrang vor einem Modul hat, es also keine Möglichkeit mehr gibt, das Modul zu importieren.

Die import-Anweisung veranlasst, dass die Programmdatei __init__.py des einzubindenden Paketes ausgeführt und der Inhalt dieser Datei als Modul in einem eigenen Namensraum verfügbar gemacht wird. So könnte nach den obigen import-Anweisungen folgendermaßen auf die Funktionen leseBild und schreibeBild zugegriffen werden:

formate.leseBild() 
formate.schreibeBild()

Um das nun geladene Bild zu modifizieren, soll diesmal ein Modul des Paketes effekte geladen werden. Auch dies ist mit der import-Anweisung möglich. Der Paketname wird durch einen Punkt vom Modulnamen getrennt. Auf diese Weise kann ein Modul aus einer beliebigen Paketstruktur importiert werden:

import effekte.blur

In diesem Fall wurde das Paket effekte vorher eingebunden. Wenn dies nicht der Fall gewesen wäre, so würde das Importieren von effekte.blur dafür sorgen, dass zunächst das Paket effekte eingebunden und die dazugehörige __init__.py ausgeführt werden würde. Danach wird das Untermodul blur eingebunden. Das Modul kann fortan wie jedes andere verwendet werden:

effekte.blur.verschwemmeBild()

Auf diese Weise kann auch direkt auf ein Modul zugegriffen werden, das tiefer in der Paketstruktur steht. Hier greifen wir beispielsweise auf das Modul formate.bmp.write zu und rufen die Funktion schreibeBMP auf, die in diesem Modul definiert werden soll.

import formate.bmp.write 
formate.bmp.write.schreibeBMP()

Auf ein eingebundenes Modul oder Paket kann nur über seinen vollen Namen, also inklusive aller übergeordneten Pakete, zugegriffen werden. Allerdings ist es auch hier möglich, durch as ein Alias zu vergeben:

import formate.bmp.write as w 
w.schreibeBMP()

Galileo Computing - Zum Seitenanfang

11.3.1 Importieren aller Module eines Pakets  Zur nächsten ÜberschriftZur vorigen Überschrift

Bisher konnte mit

from abc import *

der gesamte Inhalt eines Moduls in den aktuellen Namensraum importiert werden. Dies funktioniert für Pakete nicht. Der Grund dafür ist, dass einige Betriebssysteme, darunter vor allem Windows, bei Datei- und Ordnernamen nicht zwischen Groß- und Kleinschreibung unterscheiden – Python aber sehr wohl. Angenommen, die obige Anweisung würde wie gehabt funktionieren und abc wäre ein Paket, so wäre es beispielsweise unter Windows völlig unklar, ob ein Untermodul namens modul als Modul, MODUL oder modul eingebunden werden soll.

Aus diesem Grund importiert die obige Anweisung nicht alle im Paket enthaltenen Module in den aktuellen Namensraum, sondern importiert nur das Paket an sich und führt den Initialisierungscode in __init__.py aus. Sowohl alle in dieser Datei angelegten Elemente als auch alle Elemente von eventuell vorher importierten Modulen dieses Pakets werden in den aktuellen Namensraum eingeführt.

Es gibt zwei Möglichkeiten, das gewünschte Verhalten der obigen Anweisung zu erreichen. Beide müssen vom Autor des Pakets implementiert werden.

Zum einen können alle Module des Pakets innerhalb der __init__.py per import-Anweisung importiert werden. Dies hätte zur Folge, dass sie beim Einbinden des Paketes und damit nach dem Ausführen des Codes der __init__.py-Datei eingebunden wären.

Zum anderen kann dies durch Anlegen einer Referenz namens __all__ geschehen. Diese muss eine Liste von Strings mit den zu importierenden Modulnamen referenzieren:

__all__ = ["blur", "flip", "rotate"]

Es liegt im Ermessen des Programmierers, welches Verhalten from abc import * bei seinen Paketen zeigen soll. Beachten Sie aber, dass das Importieren des kompletten Modul- bzw. Paketinhalts in den aktuellen Namensraum zu unerwünschten Namenskonflikten führen kann. Aus diesem Grund sollten Sie importierte Module stets in einem eigenen Namensraum führen.


Galileo Computing - Zum Seitenanfang

11.3.2 Relative Importanweisungen  topZur vorigen Überschrift

Bei der Verwendung der klassischen import-Anweisung, die bislang besprochen wurde, kann es, wie bereits angemerkt wurde, zu Namenskonflikten zwischen der Standardbibliothek und einem lokalen Modul oder Paket kommen. Wenn also beispielsweise ein lokales Modul namens math existiert, gibt es keine saubere Möglichkeit mehr, das gleichnamige Modul der Standardbibliothek einzubinden.

Um solchen Konfliktfällen entgegenzuwirken, soll sich das Verhalten der import-Anweisung in künftigen Python-Versionen dahingehend ändern, dass im Konfliktfall das globale Modul bzw. Paket eingebunden wird. Das explizite Einbinden eines lokalen Moduls oder Pakets geschieht über eine sogenannte relative Importanweisung. Auf diese Weise können Namenskonflikte vermieden werden.

Seit Version 2.5 von Python sind relative Importanweisungen in die Sprache aufgenommen worden. Das Verhalten der normalen import-Anweisung wurde jedoch nicht geändert. Allerdings ist es möglich, Python 2.5 in einen Modus zu schalten, in dem sich die import-Anweisung nach den zukünftigen Regeln verhält. Dazu muss folgende Codezeile zu Beginn der jeweiligen Programmdatei geschrieben werden:

from __future__ import absolute_imports

Näheres zum Modul __future__ und seiner Bedeutung erfahren Sie in Abschnitt 13.7.

Eine relative Importanweisung wird folgendermaßen geschrieben:

from . import math

Als Basis für die relative Importanweisung dient die from/import-Anweisung, bei der ein Punkt für das aktuelle Paket steht. Im Beispiel würde also das lokale Modul math eingebunden, das sich im selben Paket befindet wie das Modul, in dem die relative Importanweisung steht.

Um ein Modul oder Paket einzubinden, das sich in einem Unterpaket befindet, wird folgende relative Importanweisung verwendet:

from .math import trig

Dieses Mal wurde vorausgesetzt, dass ein Unterpaket math existiert, in dem es ein Modul oder Paket namens trig, beispielsweise für trigonometrische Funktionen, gibt.

Mithilfe einer relativen Importanweisung ist es auch möglich, ein Modul oder Paket einzubinden, das sich in einem Paket befindet, das in der Pakethierarchie höher angeordnet ist. Im folgenden Beispiel wird das Modul trig des direkt übergeordneten Pakets math eingebunden, indem dem Paketnamen ein weiterer Punkt vorangestellt wurde:

from ..math import trig

Beachten Sie bei der Verwendung von relativen Importanweisungen, dass diese nur innerhalb einer Paketstruktur verwendet werden dürfen. Eine Programmdatei, die direkt ausgeführt wird, befindet sich nicht in einer Paketstruktur und darf deshalb keine relativen Importanweisungen enthalten. Dies bezieht sich insbesondere auch auf den interaktiven Modus.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






 <<   zurück
  
  Zum Katalog
Zum Katalog: Python






Python
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Linux






 Linux


Zum Katalog: Ubuntu GNU/Linux






 Ubuntu GNU/Linux


Zum Katalog: Praxisbuch Web 2.0






 Praxisbuch Web 2.0


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Praxisbuch Objektorientierung






 Praxisbuch Objektorientierung


Zum Katalog: Einstieg in SQL






 Einstieg in SQL


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für Fachinformatiker


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de