Benutzung des with-statements

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
flix
User
Beiträge: 9
Registriert: Freitag 11. März 2005, 18:21
Wohnort: Freiburg

Hallo Leute,

seit einiger Zeit gibt es ja Python 2.5 als beta zusammen mit ein paar Neuerungen
wie dem with-statement.

Hier in dem PEP
http://docs.python.org/dev/whatsnew/pep-343.html
steht wie man das benutzt usw., nur leider erschließt sich mir aus den
Beispielen kein praktischer Nutzen.

z.B.

Code: Alles auswählen

with open('/etc/passwd', 'r') as f:
    for line in f:
        print line
        ... more processing code ...
könnte man doch auch mittels

Code: Alles auswählen

f = open('etch/passwd','r')
for line in f:
   ...
schreiben.

In dem PEP wird erwähnt, das ich das with-statement sonst mittels
try/except/finally-Blöcke schreiben kann. Dort kann ich halt auf gewisse
Fehlersituationen reagieren. Aber wie mache ich das in dem with-statement?

Kann mir einer ein paar praktische Beispiele für das with-statement zeigen?
BlackJack

flix hat geschrieben:Hier in dem PEP
http://docs.python.org/dev/whatsnew/pep-343.html
steht wie man das benutzt usw., nur leider erschließt sich mir aus den
Beispielen kein praktischer Nutzen.
Das ist nicht das PEP-Dokument, sondern nur ein Unterabschnitt der Beschreibungen was in 2.5 neu ist. Das PEP selbst ist umfangreicher und hier nachzulesen:

http://www.python.org/dev/peps/pep-0343/
z.B.

Code: Alles auswählen

with open('/etc/passwd', 'r') as f:
    for line in f:
        print line
        ... more processing code ...
könnte man doch auch mittels

Code: Alles auswählen

f = open('etch/passwd','r')
for line in f:
   ...
schreiben.
Nicht ganz, das Äquivalent wäre:

Code: Alles auswählen

f = open('/etc/passwd', 'r')
try:
    for line in f:
        ...
finally:
    f.close()
Das müsste man, sollte man sauber programmieren wollen, eigentlich immer so schreiben. Mit der ``with`` Anweisung wird das einfacher und übersichtlicher.

Grundsätzlich kann mit mit ``with`` ein Programmuster umsetzen, das eine Folge von Anweisungen in zwei Code-Abschnitte einbettet, die jeweils davor und danach ausgeführt werden. Insbesondere wenn der Teil danach in jedem Fall ausgeführt werden soll, also auch wenn eine Ausnahme im mittleren Teil auftrat.
In dem PEP wird erwähnt, das ich das with-statement sonst mittels
try/except/finally-Blöcke schreiben kann. Dort kann ich halt auf gewisse
Fehlersituationen reagieren. Aber wie mache ich das in dem with-statement?
Es geht nicht um gezielte Reaktion auf Ausnahmen sondern nur um das ``finally``.
Kann mir einer ein paar praktische Beispiele für das with-statement zeigen?
Im PEP sind welche aufgeführt.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Die direkte Übertragung des with-Statements ist

Code: Alles auswählen

f = open("/etc/passwd", "r")
try:
     for line in f:
          etc. etc.
finally:
     f.close()
Was in der Finally-Konstruktion steht, bestimmt dabei das Objekt, das das im "with"-statement steht, in dem Fall das fileobject.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Danke BlackJack,

habe gerade gelesen, daß es in 2.5 noch

Code: Alles auswählen

from __future__ import with_statement
braucht.
Es soll erst ab Version 2.6 aktiviert sein (siehe http://docs.python.org/dev/whatsnew/pep-343.html).
Was mir allerdings nicht klar ist: Wie fängt man in einem solchen Block exceptions ab? with als Ersatz für try ... finally ist mir syntaktisch klar, wie man so allerdings try ... except ... finally umsetzt, allerdings nicht.

Gruß,
Christian
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Naja, try... except... finally gabs ja bisher auch nur als zwei Blöcke.

Selbstverständlich steht es dir frei, try... except... finally in das with-statement oder um das with-statement herum zu schreiben.
Antworten