Was ist der Python „mit“ Anweisung verwendet?
Frage
Ich versuche, die mit Anweisung in Python zu verstehen. Überall, wo ich schauen sie spricht von Öffnen und Schließen einer Datei und soll den Try-finally-Block ersetzen. Könnte jemand einige weitere Beispiele schreiben. Ich versuche nur aus Kolben und es gibt mit Aussagen in es in Hülle und Fülle. Auf jeden Fall bitten jemand etwas Klarheit darauf zu geben.
Lösung
Es gibt eine sehr schöne Erklärung hier . Grundsätzlich ist die mit Anweisung ruft zwei spezielle Methoden, die auf dem zugehörigen Objekt. Die __enter__ und __exit__ Methoden. Die Eingabe Methode gibt die Variable mit dem „mit“ Anweisung zugeordnet. Während die __exit__ Verfahren wird nach der Ausführung der Anweisung bezeichnet jede cleanup (wie Schließen eines Dateizeiger) zu handhaben.
Andere Tipps
Die Idee der with
Aussage „das Richtige zu tun“ der Weg des geringsten Widerstandes zu machen. Während die Datei Beispiel die einfachste ist, Schlösser tatsächlich bieten eine klassisches Beispiel für nicht-offensichtlich fehlerhaften Code Einfädeln:
try:
lock.acquire()
# do stuff
finally:
lock.release()
Dieser Code gebrochen - wenn die Sperre Erwerb jemals ausfällt, entweder die falsche Ausnahme ausgelöst wird (da der Code eine Verriegelung zu lösen versucht, dass es nie erworben), oder, schlimmer noch, ob dies eine rekursive Sperre ist, es wird vorzeitig entlassen. Der richtige Code sieht wie folgt aus:
lock.acquire()
try:
# do stuff
finally:
# If lock.acquire() fails, this *doesn't* run
lock.release()
Durch eine with
Anweisung, wird es unmöglich, dieses Unrecht zu bekommen, da es in den Kontext-Manager erstellt wird:
with lock: # The lock *knows* how to correctly handle acquisition and release
# do stuff
Der andere Ort, an dem die with
Aussage stark ist der große Vorteil von Funktion und Klasse Dekorateure ähnlich hilft: es nimmt „zwei Stück“ Code, der durch eine beliebige Anzahl von Zeilen Code (die Funktionsdefinition für Dekorateure getrennt werden kann, der try
Block im aktuellen Fall) und wandelt es in „ein Stück“ Code, wo der Programmierer einfach vorne erklärt, was sie zu tun versuchen.
Für kurze Beispiele, dies sieht nicht wie ein großer Gewinn, aber es macht wirklich einen großen Unterschied, wenn der Code zu überprüfen. Als ich lock.acquire()
in einem Stück Code zu sehen, muß ich für eine entsprechende lock.release()
nach unten scrollen und zu überprüfen. Als ich with lock:
sehen, obwohl, ist keine solche Überprüfung erforderlich. - Ich kann sofort sehen, dass das Schloss korrekt freigegeben werden
Es gibt zwölf Beispiele für die Verwendung with
in PEP343 , einschließlich der Datei -open Beispiel:
- Eine Vorlage, um sicherzustellen, dass eine Sperre, zu Beginn eines erworbene Block freigegeben wird, wenn der Block verlassen wird
- Eine Vorlage zum Öffnen einer Datei, die die Datei gewährleistet ist geschlossen wenn der Block links
- Eine Vorlage für die Begehung oder Rollback eine Datenbank Transaktion
- Beispiel 1 neu geschrieben, ohne einen Generator
- Redirect stdout vorübergehend
- Eine Variante () geöffnet wurde, dass auch eine Fehlerbedingung zurück
- Ein weiteres nützliches Beispiel wäre eine Operation sein, dass die Blöcke Signale
- Eine andere Verwendung für diese Funktion ist die Dezimal Kontext
- Hier ist ein einfacher Kontext-Manager für das Dezimalsystem Modul
- Ein generischer "objekt schließt" Kontext-Manager
- a veröffentlicht () Kontext vorübergehend eine zuvor erworbene Verriegelung zu lösen, indem die acquire Swapping () und Release () ruft
- A „verschachtelt“ Kontext-Manager, dass automatisch verschachteln die mitgelieferten Kontexte von links nach rechts übermäßig zu vermeiden Vertiefung