512 Stimmen

Wofür ist die Python-Anweisung "with" gedacht?

Ich bin auf die Python with Erklärung heute zum ersten Mal abgegeben. Ich benutze Python schon seit einigen Monaten und wusste nicht einmal, dass es existiert! In Anbetracht seines etwas obskuren Status dachte ich, es wäre eine Frage wert:

  1. Was ist die Python with Anweisung für die sie verwendet werden soll?
  2. Was tun verwenden Sie es?
  3. Gibt es irgendwelche Fallstricke, die ich beachten muss, oder gängige Anti-Patterns im Zusammenhang mit der Verwendung? Gibt es Fälle, in denen es besser ist try..finally als with ?
  4. Warum wird sie nicht häufiger eingesetzt?
  5. Welche Standardbibliotheksklassen sind mit ihr kompatibel?

11voto

stefanB Punkte 72857

Ver PEP 343 - Die "mit"-Anweisung gibt es am Ende einen Abschnitt mit Beispielen.

... neue Anweisung "with" in der Sprache Python Sprache, um die die Standardverwendung von try/finally-Anweisungen zu umgehen.

5voto

cobbal Punkte 68319

Die Punkte 1, 2 und 3 sind einigermaßen gut abgedeckt:

4: Es ist relativ neu und nur in Python2.6+ verfügbar (oder Python2.5 mit from __future__ import with_statement )

4voto

zefciu Punkte 2049

Die with-Anweisung arbeitet mit sogenannten Kontextmanagern:

http://docs.python.org/release/2.5.2/lib/typecontextmanager.html

Die Idee ist, die Behandlung von Ausnahmen zu vereinfachen, indem die notwendigen Aufräumarbeiten nach Verlassen des 'with'-Blocks durchgeführt werden. Einige der Python-Build-Ins arbeiten bereits als Kontextmanager.

3voto

bgse Punkte 7924

Ein weiteres Beispiel für eine sofort einsatzbereite Unterstützung, die auf den ersten Blick etwas verwirrend sein kann, wenn man an die Art und Weise gewöhnt ist, wie integrierte open() verhält, sind connection Objekte beliebter Datenbankmodule wie z. B.:

Le site connection Objekte sind Kontextmanager und können als solche sofort in einer Datenbank verwendet werden. with-statement Beachten Sie jedoch bei der Verwendung der obigen Angaben, dass:

Wenn die with-block beendet ist, entweder mit einer Ausnahme oder ohne, die Verbindung ist nicht geschlossen . Für den Fall, dass die with-block mit einer Ausnahme beendet wird, wird die Transaktion zurückgesetzt, andernfalls wird die Transaktion festgeschrieben.

Dies bedeutet, dass der Programmierer darauf achten muss, die Verbindung selbst zu schließen, erlaubt aber, eine Verbindung zu erwerben und sie in mehreren with-statements wie in der folgenden Tabelle dargestellt psycopg2-Dokumente :

conn = psycopg2.connect(DSN)

with conn:
    with conn.cursor() as curs:
        curs.execute(SQL1)

with conn:
    with conn.cursor() as curs:
        curs.execute(SQL2)

conn.close()

Im obigen Beispiel werden Sie feststellen, dass die cursor Objekte von psycopg2 sind ebenfalls Kontextmanager. Aus der einschlägigen Dokumentation über das Verhalten:

Wenn ein cursor verlässt die with-block wird er geschlossen und alle eventuell mit ihm verbundenen Ressourcen werden freigegeben. Der Zustand der Transaktion bleibt davon unberührt.

3voto

Tushar Patil Punkte 1249

In Python allgemein " mit Die Anweisung "close()" wird verwendet, um eine Datei zu öffnen, die in der Datei vorhandenen Daten zu verarbeiten und die Datei zu schließen, ohne eine close()-Methode aufzurufen. Die "with"-Anweisung vereinfacht die Behandlung von Ausnahmen, indem sie Aufräumarbeiten vorsieht.

Allgemeine Form von mit:

with open(“file name”, “mode”) as file_var:
    processing statements

Anmerkung: Sie müssen die Datei nicht durch den Aufruf von close() auf file_var.close()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X