Was ist das python - "mit" - Anweisung entwickelt?
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?
Nur für das Protokoll, hier ist
with
in Python-3-Dokumentation.InformationsquelleAutor 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:
Okay, so lassen Sie mich dies klar. Du sagst, dass die
with
- Anweisung dient zum füllen einer Variablen mit Daten, bis die Anweisungen, die unter ihm sind abgeschlossen, und dann frei die variable?Da habe ich es zu öffnen, ein py script.
with open('myScript.py', 'r') as f: pass
. Ich erwartete Lage sein, rufen Sie die variablef
zu sehen, den text-Inhalt des Dokuments, da dies ist, was angezeigt würde, wenn das Dokument zugeordnet wurdenf
über eine normaleopen
Aussage:f = open('myScript.py').read()
. Aber stattdessen bekam ich Folgendes:<_io.TextIOWrapper name='myScript.py' mode='r' encoding='cp1252'>
. Was bedeutet es?mit
with
nicht entfernen zu müssenread
auf die eigentliche Datei. Diewith
Anrufeopen
- er weiß nicht, was Sie tun müssen, um mit it - möchten Sie vielleicht zu tun, ein suchen, zum Beispiel.InformationsquelleAutor 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.with
.diveintopython.org ist down (dauerhaft?). Gespiegelt unter diveintopython.net
Beispiel für eine gute Antwort, öffnen der Datei ist ein Paradebeispiel, das zeigt, hinter den kulissen der öffnung,io,schließen Sie die Datei-Operationen verborgen sind sauber mit einem benutzerdefinierten Referenz name
diveintopython3.org ist ein broken link.
Ich aktualisierte den link für Sie.
InformationsquelleAutor 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 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 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 JudoWill
Sehen PEP 343 - Die 'with' - Anweisung, es ist ein Beispiel-Abschnitt am Ende.
InformationsquelleAutor stefanB
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 cobbal
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 zefciu
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 bgse
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 Tushar.PUCSD