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.

War es hilfreich?

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:

  1. Eine Vorlage, um sicherzustellen, dass eine Sperre, zu Beginn eines erworbene    Block freigegeben wird, wenn der Block verlassen wird
  2. Eine Vorlage zum Öffnen einer Datei, die die Datei gewährleistet ist geschlossen    wenn der Block links
  3. Eine Vorlage für die Begehung oder Rollback eine Datenbank    Transaktion
  4. Beispiel 1 neu geschrieben, ohne einen Generator
  5. Redirect stdout vorübergehend
  6. Eine Variante () geöffnet wurde, dass auch eine Fehlerbedingung zurück
  7. Ein weiteres nützliches Beispiel wäre eine Operation sein, dass die Blöcke    Signale
  8. Eine andere Verwendung für diese Funktion ist die Dezimal Kontext
  9. Hier ist ein einfacher Kontext-Manager für das Dezimalsystem Modul
  10. Ein generischer "objekt schließt" Kontext-Manager
  11. a veröffentlicht () Kontext vorübergehend eine zuvor erworbene Verriegelung zu lösen, indem die acquire Swapping () und Release () ruft
  12. A „verschachtelt“ Kontext-Manager, dass automatisch verschachteln die      mitgelieferten Kontexte von links nach rechts übermäßig zu vermeiden      Vertiefung
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top