Wofür ist die Python "with" -Anweisung gedacht?
Stieß ich auf den Python with
- Anweisung zum ersten mal heute. Ich habe mit Python leicht für mehrere Monate und hatte noch nicht einmal von Ihrer Existenz wissen! Angesichts seiner etwas obskuren status, ich dachte, es wäre Wert, zu Fragen:
- Was ist das Python -
with
- Anweisung
entwickelt, um verwendet werden? - Was tun
Sie nutzen es für? - Gibt es
Fallstricke muss ich beachten, oder
gemeinsame anti-mustern, die mit
seine Verwendung? Die Fälle, wo es besser ist, verwenden Sietry..finally
alswith
? - Warum ist es nicht weiter verbreitet?
- Die standard-Bibliothek Klassen sind kompatibel mit ihm sein?
InformationsquelleAutor der Frage fmark | 2010-06-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, das wurde schon beantwortet von anderen Usern vor mir, so dass ich nur hinzufügen, dass es der Vollständigkeit halber: die
with
- Anweisung vereinfacht exception-handling durch die Kapselung gemeinsame Vorbereitung und Bereinigung von Aufgaben in so genannte Kontext-Manager. Mehr details finden Sie in PEP 343. Zum Beispiel, dieopen
- Anweisung wird ein context-manager in sich selbst, können Sie eine Datei öffnen, halten Sie es so lange offen, wie die Ausführung ist im Rahmen derwith
Anweisung, wo man es verwendet, und schließen Sie es, sobald Sie aus dem Zusammenhang, egal ob Sie verlassen haben, weil es eine Ausnahme ist, oder während der normalen Ablaufsteuerung. Diewith
- Anweisung kann somit verwendet werden, in einer Weise ähnlich zu der RAII pattern in C++: eine Ressource erworben wird, durch diewith
Anweisung und freigegeben, wenn Sie verlassen diewith
Kontext.Einige Beispiele sind: öffnen von Dateien mit
with open(filename) as fp:
dass sperren mitwith lock:
(wolock
ist eine Instanz vonthreading.Lock
). Sie können auch erstellen Sie Ihre eigenen Kontext-Führungskräfte, die mit dercontextmanager
Dekorateurin auscontextlib
. Zum Beispiel verwende ich oft, wenn ich haben, ändern Sie das aktuelle Verzeichnis temporär-und dann wieder wo ich war:Hier ist ein weiteres Beispiel, vorübergehend leitet
sys.stdin
sys.stdout
undsys.stderr
zu einigen anderen Datei-handles und stellt Sie wieder her später:Und schließlich, ein weiteres Beispiel, erstellt Sie einen temporären Ordner und löscht es beim verlassen der Kontext:
InformationsquelleAutor der Antwort Tamás
Ich würde vorschlagen, zwei interessante Vorträge:
der "with" - Anweisung
1.
Die
with
- Anweisung wird verwendet, um wickeln Sie die Ausführung eines Blockes mit den Methoden definiert, die von einem context-manager. Dies erlaubt eine gemeinsametry...except...finally
Verwendung von mustern gekapselt werden für komfortable Wiederverwendung.2.
Sie könnten etwas tun wie:
ODER
ODER (Python 3.1)
ODER
3.
Ich sehe keine Antipattern hier.
Zitieren Dive into Python:
4.
Ich denke, es ist mit Programmierern, die Gewohnheit zu
try..catch..finally
Aussage aus anderen Sprachen.InformationsquelleAutor der Antwort systempuntoout
Python
with
Anweisung built-in-Sprache-Unterstützung derResource Acquisition Is Initialization
idiom Häufig verwendet, in C++. Es soll eine sichere übernahme und Freigabe von Betriebssystem-Ressourcen.Den
with
- Anweisung erstellt Ressourcen innerhalb eines Bereichs/Blocks. Schreiben Sie Ihren code mithilfe der Ressourcen innerhalb des Blocks. Wenn der block vorhanden, werden die Ressourcen sauber freigegeben unabhängig vom Ausgang der code im block (das heißt, ob der block wird normalerweise beendet oder aufgrund einer Ausnahme).Viele Ressourcen in die Python-Bibliothek, die gehorchen, das Protokoll erforderte von den
with
Anweisung und so können mit out-of-the-box. Allerdings kann jeder machen-Ressourcen, die verwendet werden können in einer with-Anweisung durch die Umsetzung der gut dokumentierten Protokoll: PEP 0343Verwenden Sie es, Wann immer Sie erwerben die Ressourcen Ihrer Anwendung, müssen explizit aufgegeben, wie Dateien, Netzwerk-verbindungen, Schlösser und dergleichen.
InformationsquelleAutor der Antwort Tendayi Mawushe
Ein Beispiel für ein antipattern ist möglicherweise die Verwendung der
with
innerhalb einer Schleife, wenn es effizienter wäre, diewith
außerhalb der Schleifebeispielsweise
vs
Die erste Möglichkeit ist das öffnen und schließen der Datei für jeden
row
verursachen können performance-Probleme im Vergleich zu der zweiten Art mit, öffnet und schließt die Datei nur einmal.InformationsquelleAutor der Antwort John La Rooy
Wieder der Vollständigkeit halber werde ich hinzufügen, meine nützlichste Anwendungsfall für
with
Aussagen.Ich eine Menge zu tun scientific computing und für manche Aktivitäten muss ich die
Decimal
Bibliothek für beliebig genaue Berechnungen. Ein Teil von meinem code muss ich hohe Präzision und für die meisten anderen Teile, die ich brauche weniger Präzision.Habe ich meine Standard-Genauigkeit, eine geringe Zahl, und verwenden Sie dann
with
um eine präzisere Antwort für manche Abschnitte:Benutze ich dies viel mit der Hypergeometrische Test-das erfordert die division von großen zahlen daraus resultierende form faktorielle. Wenn Sie das tun genomischen Maßstab Berechnungen, die Sie haben, vorsichtig zu sein von Runden-und overflow-Fehler.
InformationsquelleAutor der Antwort JudoWill
Sehen PEP 343 - Die 'with' - Anweisunges ist ein Beispiel-Abschnitt am Ende.
InformationsquelleAutor der Antwort stefanB
In der with-Anweisung arbeitet mit so genannten Kontext-Manager:
http://docs.python.org/release/2.5.2/lib/typecontextmanager.html
Die Idee ist, vereinfachen Sie die Ausnahmebehandlung, indem Sie die notwendigen Aufräumarbeiten nach dem verlassen der 'mit' - block. Einige der python built-ins arbeiten bereits als Kontext-Manager.
InformationsquelleAutor der Antwort zefciu
Punkte 1, 2 und 3 als relativ gut abgedeckt:
4: es ist relativ neu, nur in python2.6+ (oder python2.5 mit
from __future__ import with_statement
)InformationsquelleAutor der Antwort cobbal
In python in der Regel "mit" - Anweisung wird verwendet, um eine Datei zu öffnen, Bearbeiten die Daten in der Datei vorhanden ist, und auch, um die Datei schließen, ohne Aufruf einer Methode close (). "mit" - Anweisung wird die exception handling einfacher, indem Aufräumarbeiten.
Allgemeine form:
Hinweis: keine Notwendigkeit, um das schließen der Datei durch den Aufruf close() mit der Datei-var.close () -
InformationsquelleAutor der Antwort Tushar.PUCSD
Weiteres Beispiel für out-of-the-box-Unterstützung, und eine, die vielleicht ein bisschen verwirrend auf den ersten, wenn Sie werden verwendet, um die Art und Weise eingebaute
open()
verhält, sindconnection
Objekte der beliebten Datenbank-Module wie:Den
connection
Objekte Kontext-Manager und kann als solcher verwendet werden out-of-the-box in einerwith-statement
jedoch bei Verwendung der oben beachten Sie, dass:Dies bedeutet, dass der Programmierer zu kümmern hat das schließen der Verbindung selbst, sondern können zu erwerben, eine Verbindung, und verwenden Sie es in mehrere
with-statements
wie gezeigt, in der psycopg2 docs:Im obigen Beispiel, werden Sie feststellen, dass die
cursor
Objektepsycopg2
auch der Kontext-Manager. Von der relevanten Dokumentation auf das Verhalten:InformationsquelleAutor der Antwort bgse