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 13 Weitere Spracheigenschaften
  Pfeil 13.1 Exception Handling
    Pfeil 13.1.1 Eingebaute Exceptions
    Pfeil 13.1.2 Werfen einer Exception
    Pfeil 13.1.3 Abfangen einer Exception
    Pfeil 13.1.4 Eigene Exceptions
    Pfeil 13.1.5 Erneutes Werfen einer Exception
  Pfeil 13.2 List Comprehensions
  Pfeil 13.3 Docstrings
  Pfeil 13.4 Generatoren
  Pfeil 13.5 Iteratoren
  Pfeil 13.6 Interpreter im Interpreter
  Pfeil 13.7 Geplante Sprachelemente
  Pfeil 13.8 Die with-Anweisung
  Pfeil 13.9 Function Decorator
  Pfeil 13.10 assert
  Pfeil 13.11 Weitere Aspekte der Syntax
    Pfeil 13.11.1 Umbrechen langer Zeilen
    Pfeil 13.11.2 Zusammenfügen mehrerer Zeilen
    Pfeil 13.11.3 String conversions


Galileo Computing - Zum Seitenanfang

13.8 Die with-Anweisung  topZur vorigen Überschrift

Im vorherigen Abschnitt wurde die with-Anwendung angesprochen, mit der sich ein Codeblock in einem bestimmten Kontext ausführen lässt. Die with-Anweisung wird erst in Python 2.6 zum Sprachumfang gehören, kann aber mithilfe des Moduls __future__ bereits in Python 2.5 verwendet werden.

Es gibt Operationen, die in einem bestimmten Kontext ausgeführt werden müssen und bei denen sichergestellt werden muss, dass der Kontext jederzeit korrekt deinitialisiert wird, beispielsweise auch, wenn eine Exception auftritt. Als Beispiel für einen solchen Kontext dient das Dateiobjekt. Es muss sichergestellt sein, dass die close-Methode des Dateiobjekts gerufen wird, selbst wenn zwischen dem Aufruf von open und dem der close-Methode des Dateiobjekts eine Exception geworfen wurde. Dazu ist mit den herkömmlichen Sprachelementen Pythons folgende try/finally-Anweisung nötig:

f = open("datei.txt", "r") 
try: 
    print f.read() 
finally: 
    f.close()

Zunächst wird eine Datei namens datei.txt zum Lesen geöffnet. Mithilfe der darauf folgenden try/finally-Anweisung wird sichergestellt, dass f.close in jedem Fall aufgerufen wird. Dieses Beispiel lässt sich mit der with-Anweisung folgendermaßen formulieren. Beachten Sie, dass die erste Zeile ab Python 2.6 nicht mehr benötigt wird.

from __future__ import with_statement 
with open("programm.py", "r") as f: 
    print f.read()

Die with-Anweisung besteht aus dem Schlüsselwort with, gefolgt von einer Instanz. Optional kann auf die Instanz das Schlüsselwort as und ein Bezeichner folgen. Dieser Bezeichner wird Target genannt, und seine Bedeutung hängt von der verwendeten Instanz ab. Im obigen Beispiel referenziert f das geöffnete Dateiobjekt. Um zu verstehen, was bei einer with-Anweisung genau passiert, soll im nächsten Beispiel eine eigene Klasse definiert werden, die sich mit der with-Anweisung verwenden lässt. Eine solche Klasse wird Kontextmanager genannt.

Die Klasse MeinLogfile ist dafür gedacht, eine rudimentäre Logdatei zu führen. Dazu implementiert sie die Funktion eintrag, die eine neue Zeile in die Logdatei schreibt. Die Klassendefinition sieht folgendermaßen aus:

class MeinLogfile(object):
def __init__(self, logfile): self.logfile = logfile self.f = None
def eintrag(self, text): self.f.write("==>%s\n" % text)
def __enter__(self): self.f = open(self.logfile, "w") return self
def __exit__(self, exc_type, exc_value, traceback): self.f.close()

Zu den beiden ersten Methoden der Klasse ist nicht viel zu sagen. Dem Konstruktor __init__ wird der Dateiname der Logdatei übergeben, der intern im Attribut self.logfile gespeichert wird. Zusätzlich wird das Attribut self.f angelegt, das später das geöffnete Dateiobjekt referenzieren soll.

Die Methode eintrag hat die Aufgabe, den übergebenen Text in die Logdatei zu schreiben. Dazu ruft sie einfach die Methode write des Dateiobjekts auf. Beachten Sie, dass die Methode eintrag nur innerhalb einer with-Anweisung aufgerufen werden kann, da das Dateiobjekt erst in den folgenden Magic Functions geöffnet und geschlossen wird.

Die angesprochenen Magic Functions __enter__ und __exit__ sind das Herzstück der Klasse und müssen implementiert werden, wenn die Klasse im Zusammenhang mit with verwendet werden soll. Die Methode __enter__ wird aufgerufen, wenn der Kontext aufgebaut, also bevor der Körper der with-Anweisung ausgeführt wird. Die Methode bekommt keine Parameter, gibt aber einen Wert zurück. Der Rückgabewert von __enter__ wird später vom Target-Bezeichner referenziert, sofern einer angegeben wurde. Im Falle unserer Beispielklasse wird die Datei self.logfile zum Schreiben geöffnet und mit return self eine Referenz auf die eigene Instanz zurückgegeben.

Die zweite Magic Function __exit__ wird aufgerufen, wenn der Kontext verlassen wird, also nachdem der Körper der with-Anweisung entweder vollständig durchlaufen ist oder durch eine Exception vorzeitig abgebrochen wurde. Im Falle der Beispielklasse wird das geöffnete Dateiobjekt self.f geschlossen. Näheres zu den drei Parametern der Methode __exit__ folgt weiter unten.

Die soeben erstellte Klasse MeinLogfile lässt sich folgendermaßen mit with verwenden:

from __future__ import with_statement 
inst = MeinLogfile("logfile.txt") 
with inst as log: 
    log.eintrag("Hallo Welt") 
    log.eintrag("Na, wie gehts?")

Zur Erklärung: Zunächst wird eine Instanz der Klasse MeinLogfile erstellt und dabei der Dateiname logfile.txt übergeben. Die with-Anweisung bewirkt als Erstes, dass die Methode __enter__ der Instanz inst ausgeführt und ihr Rückgabewert durch log referenziert wird. Dann wird der Körper der with-Anweisung ausgeführt, in dem insgesamt zweimal die Methode eintrag aufgerufen und damit Text in die Logdatei geschrieben wird. Nachdem der Anweisungskörper ausgeführt worden ist, wird einmalig die Methode __exit__ der Instanz inst aufgerufen.

Im Folgenden sollen die Magic Functions __enter__ und __exit__ vollständig erläutert werden.

__enter__(self)

Diese Magic Function wird einmalig zum Öffnen des Kontexts aufgerufen, bevor der Körper der with-Anweisung ausgeführt wird. Der Rückgabewert dieser Methode wird im Körper der with-Anweisung vom Target-Bezeichner referenziert.

__exit__(self, exc_type, exc_value, traceback)

Die Magic Function __exit__ wird einmalig zum Schließen des Kontexts aufgerufen, nachdem der Körper der with-Anweisung ausgeführt worden ist. Die drei Parameter exc_type, exc_value und traceback spezifizieren Typ, Wert und Traceback-Objekt einer eventuell innerhalb des with-Anweisungskörpers geworfenen Exception. Wenn keine Exception geworfen wurde, referenzieren alle drei Parameter None. Wie mit einer geworfenen Exception weiter verfahren wird, kann mit dem Rückgabewert der Methode __exit__ gesteuert werden: Gibt die Methode True zurück, wird die Exception unterdrückt. Bei einem Rückgabewert von False wird die Exception erneut geworfen.



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