Python-Hinweise: mit und Kontextmanager

Die with-Anweisung ist eine vereinfachte Syntax, die von Pyhton bereitgestellt wird. Sie eignet sich für den Zugriff auf Ressourcen. Sie stellt sicher, dass notwendige „Reinigungs“-Vorgänge durchgeführt und Ressourcen freigegeben werden, unabhängig davon, ob während der Verwendung eine Ausnahme auftritt. Die with-Anweisung wird hauptsächlich zur Vereinfachung von Code verwendet Operationen.

Kontextmanager

  • Kontext ist die wörtliche Übersetzung des Kontexts, der in Programmen verwendet wird, um die Umgebung während der Codeausführung darzustellen.
  • Jedes Objekt, das __enter__() und __exit__() implementiert, ist ein Kontextmanager
  • Oben: Vorgänge vor der normalen Codeausführung; Unten: Vorgänge nach der normalen Codeausführung, z. B. Ausnahmen oder Code beenden/schließen
  • Der Kontextmanager kann das Schlüsselwort with verwenden, um sicherzustellen, dass die Datei geschlossen werden kann. Dies ist eine Alternative zu try/finally
class Foo(object):

    def __init__(self):
        print('实例化一个对象')

    def __enter__(self):
        print('进入')

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('退出')

obj = Foo()

with obj:
    print('正在执行')

Instanziieren Sie ein Objekt.
Enter
Executing
Exit

Da wir bei der Definition von Foo die Methoden __enter__ und __exit__ definiert haben, ist das von uns instanziierte Objekt obj ein Kontextmanager

mit Kontextmanager:
 Anweisungskörper

Wenn with auf einen Kontextmanager trifft, führt er die __enter__-Methode des Kontextmanagers aus, bevor er den Anweisungstext ausführt. Sie wird im Allgemeinen verwendet, um Inhalte vor der Operation zu verarbeiten, z. B. Objekterstellung, Initialisierung usw., und dann den Anweisungstext auszuführen. Danach Beim Ausführen des Anweisungskörpers wird schließlich die Methode __exit__ ausgeführt, die im Allgemeinen für einige Abschlussarbeiten verwendet wird, z. B. das Schließen von Dateien, das Schließen von Datenbanken usw. Der Gesamtprozess ist wie folgt:.

  1. Rufen Sie die Enter-Methode auf, um Vorverarbeitungsvorgänge auszuführen.
    2. Führen Sie Benutzeroperationen aus.
    3. Rufen Sie die Exit-Methode auf, um den Bereinigungsvorgang abzuschließen

2. Beim Aufruf der __enter__()-Methode des Kontextmanagers wird bei Verwendung der as-Klausel der Rückgabewert der __enter__()-Methode dem Ziel in der as-Klausel zugewiesen.

mit Kontextmanager als Ziel:
Code-Anweisungskörper

class Foo(object):

    def __init__(self):
        print('实例化一个对象')

    def __enter__(self):
        print('进入')
        # return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('退出')

with Foo() as obj:
    print(obj,type(obj))
    print('正在执行')

Fügen Sie hier eine Bildbeschreibung ein
Kommentieren Sie die Codezeile aus, die wir im obigen Code auskommentiert haben. Das Ergebnis ist wie folgt: Auf „with“
Fügen Sie hier eine Bildbeschreibung ein
muss ein Kontextmanager folgen. Wenn „as“ verwendet wird, wird der Rückgabewert der Methode „enter ()“ des Kontextmanagers zugewiesen Ziel. Ziel kann eine einzelne Variable oder ein von „()“ umschlossenes Tupel sein (es kann keine Liste von Variablen sein, die nur durch "," getrennt sind, „()“ muss hinzugefügt werden)

mit und Ausnahmebehandlung

with语句类似以下功能
  try :
		语句体
  except:
		exit()
  finally:
  	其它

Die with-Anweisung übergibt den Ausnahmetyp, den Wert und den Traceback an die Methode __exit__, sodass die Methode __exit__ die Ausnahme behandeln kann. Wenn eine Ausnahme auftritt und der Ausgang „Falsch“ zurückgibt (der Standardwert ist „Falsch“, wenn der Rückgabewert nicht geschrieben wird), wird die Ausnahme erneut ausgelöst und eine andere Anweisungslogik als „with“ behandelt die Ausnahme. Dies ist ebenfalls eine gängige Praxis; if Gibt es True zurück, handelt es sich um eine ignorierte Ausnahme, die Ausnahme wird nicht mehr behandelt und der nachfolgende Code wird weiterhin ausgeführt.

class Foo(object):

    def __init__(self):
        print('实例化一个对象')

    def __enter__(self):
        print('进入')

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('退出')
     # return True

obj = Foo()

with obj:
    raise ImportError
    print('正在执行')

Das Ergebnis ist wie folgt:
Fügen Sie hier eine Bildbeschreibung ein
Kommentieren Sie die Codezeile aus, die wir im obigen Code auskommentiert haben. Das Ergebnis ist wie folgt:
Fügen Sie hier eine Bildbeschreibung ein

Eine gängige Methode zum Lesen von Dateien:

mit open("/tmp/foo.txt") als Datei:
data = file.read()

  1. Beim Ausführen der with-Anweisung wird zuerst der offene Code ausgeführt, der auf die with-Anweisung folgt.
  2. Nachdem der Code ausgeführt wurde, wird das Ergebnis des Codes als [Rückgabewert der Eingabemethode] in f gespeichert.
  3. Führen Sie dann den folgenden eigentlichen Vorgang aus
  4. Nach dem Vorgang ist es nicht erforderlich, den Vorgang zum Schließen der Datei zu schreiben. Die Datei wird nach der Verwendung automatisch geschlossen [Ausführung der Methode beenden].

Hier wird die with-Anweisung verwendet. Unabhängig davon, ob während der Dateiverarbeitung eine Ausnahme auftritt, ist garantiert, dass das geöffnete Dateihandle nach Ausführung der with-Anweisung geschlossen wurde . Wenn Sie das traditionelle Try/finally-Paradigma verwenden, würden Sie Code ähnlich dem folgenden verwenden:

somefile = open(r'somefileName')
try:
    for line in somefile:
        print line
        # ...more code
finally:
    somefile.close()

Im Vergleich dazu kann die Verwendung der with-Anweisung den Codierungsaufwand reduzieren.

andere:

with kann nur mit Kontextmanagern verwendet werden. Zu den gängigen Kontextmanagern gehören

Datei
dezimal.Kontext
-Thread.LockType
-Threading.Lock
-Threading.RLock -
Threading.Bedingungs
-Threading.Semaphore
-Threading.BoundedSemaphore

Referenzlinks:
1.https://www.cnblogs.com/huchong/p/8268765.html

Ich denke du magst

Origin blog.csdn.net/qq_44804542/article/details/115980557
Empfohlen
Rangfolge