Seite 1 von 1

Benutzung des with-statements

Verfasst: Mittwoch 6. September 2006, 12:22
von flix
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?

Re: Benutzung des with-statements

Verfasst: Mittwoch 6. September 2006, 13:59
von 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.

Verfasst: Mittwoch 6. September 2006, 14:18
von birkenfeld
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.

Verfasst: Mittwoch 6. September 2006, 14:19
von CM
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

Verfasst: Mittwoch 6. September 2006, 14:26
von birkenfeld
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.