logo

mit Anweisung in Python

In Python, mit Aussage wird bei der Ausnahmebehandlung verwendet, um den Code sauberer und besser lesbar zu machen. Es vereinfacht die Verwaltung gemeinsamer Ressourcen wie Dateiströme. Sehen Sie sich das folgende Codebeispiel an, wie die Verwendung der with-Anweisung den Code sauberer macht.

Python3




Wie groß ist dieser Monitor?





# file handling> # 1) without using with statement> file> => open>(>'file_path'>,>'w'>)> file>.write(>'hello world !'>)> file>.close()> # 2) without using with statement> file> => open>(>'file_path'>,>'w'>)> try>:> >file>.write(>'hello world'>)> finally>:> >file>.close()>



>

>

Python3


strsep c



# using with statement> with>open>(>'file_path'>,>'w'>) as>file>:> >file>.write(>'hello world !'>)>

>

>

Beachten Sie, dass im Gegensatz zu den ersten beiden Implementierungen bei Verwendung der with-Anweisung kein Aufruf von file.close() erforderlich ist. Die with-Anweisung selbst stellt die ordnungsgemäße Erfassung und Freigabe von Ressourcen sicher. Eine Ausnahme während des file.write()-Aufrufs in der ersten Implementierung kann verhindern, dass die Datei ordnungsgemäß geschlossen wird, was zu mehreren Fehlern im Code führen kann, d. h. viele Änderungen an Dateien werden erst wirksam, wenn die Datei ordnungsgemäß geschlossen wird. Der zweite Ansatz im obigen Beispiel kümmert sich um alle Ausnahmen, aber durch die Verwendung der with-Anweisung wird der Code kompakter und viel besser lesbar. Somit trägt die with-Anweisung dazu bei, Fehler und Lecks zu vermeiden, indem sie sicherstellt, dass eine Ressource ordnungsgemäß freigegeben wird, wenn der Code, der die Ressource verwendet, vollständig ausgeführt ist. Die with-Anweisung wird häufig mit Dateistreams verwendet, wie oben gezeigt, sowie mit Sperren, Sockets, Unterprozessen und Telnets usw.

Unterstützung der with-Anweisung in benutzerdefinierten Objekten

Es gibt nichts Besonderes in open(), wodurch es mit der with-Anweisung verwendet werden kann und die gleiche Funktionalität kann in benutzerdefinierten Objekten bereitgestellt werden. Durch die Unterstützung mit der Anweisung in Ihren Objekten wird sichergestellt, dass Sie niemals eine Ressource offen lassen. Um die with-Anweisung in benutzerdefinierten Objekten zu verwenden, müssen Sie nur die Methoden __enter__() und __exit__() in den Objektmethoden hinzufügen. Betrachten Sie zur weiteren Verdeutlichung das folgende Beispiel.

Python3




# a simple file writer object> class> MessageWriter(>object>):> >def> __init__(>self>, file_name):> >self>.file_name>=> file_name> > >def> __enter__(>self>):> >self>.>file> => open>(>self>.file_name,>'w'>)> >return> self>.>file> >def> __exit__(>self>,>*>args):> >self>.>file>.close()> # using with statement with MessageWriter> with MessageWriter(>'my_file.txt'>) as xfile:> >xfile.write(>'hello world'>)>

>

>

Schauen wir uns den obigen Code an. Wie Sie bemerken, folgt auf das Schlüsselwort with der Konstruktor von MessageWriter. Sobald die Ausführung in den Kontext der with-Anweisung eintritt, wird ein MessageWriter-Objekt erstellt und Python ruft dann die Methode __enter__() auf. Initialisieren Sie in dieser __enter__()-Methode die Ressource, die Sie im Objekt verwenden möchten. Diese __enter__()-Methode sollte immer einen Deskriptor der erfassten Ressource zurückgeben. Was sind Ressourcendeskriptoren? Dies sind die vom Betriebssystem bereitgestellten Handles für den Zugriff auf die angeforderten Ressourcen. Im folgenden Codeblock ist „file“ ein Deskriptor der Dateistreamressource.

Python


Mausrad scrollt nicht richtig



file> => open>(>'hello.txt'>)>

>

>

Im oben bereitgestellten MessageWriter-Beispiel erstellt die Methode __enter__() einen Dateideskriptor und gibt ihn zurück. Der Name xfile wird hier verwendet, um auf den Dateideskriptor zu verweisen, der von der Methode __enter__() zurückgegeben wird. Der Codeblock, der die erworbene Ressource verwendet, wird innerhalb des Blocks der with-Anweisung platziert. Sobald der Code im with-Block ausgeführt wird, wird die Methode __exit__() aufgerufen. Alle erworbenen Ressourcen werden in der Methode __exit__() freigegeben. So verwenden wir die with-Anweisung mit benutzerdefinierten Objekten. Diese Schnittstelle der Methoden __enter__() und __exit__(), die die Unterstützung der with-Anweisung in benutzerdefinierten Objekten bietet, wird aufgerufen Kontextmanager .

Das contextlib-Modul

Ein klassenbasierter Kontextmanager wie oben gezeigt ist nicht die einzige Möglichkeit, die with-Anweisung in benutzerdefinierten Objekten zu unterstützen. Der contextlib Das Modul bietet einige weitere Abstraktionen, die auf der grundlegenden Kontextmanager-Schnittstelle basieren. So können wir den Kontextmanager für das MessageWriter-Objekt mithilfe des contextlib-Moduls neu schreiben.

Python3




from> contextlib>import> contextmanager> class> MessageWriter(>object>):> >def> __init__(>self>, filename):> >self>.file_name>=> filename> >@contextmanager> >def> open_file(>self>):> >try>:> >file> => open>(>self>.file_name,>'w'>)> >yield> file> >finally>:> >file>.close()> # usage> message_writer>=> MessageWriter(>'hello.txt'>)> with message_writer.open_file() as my_file:> >my_file.write(>'hello world'>)>

Zufallszahl in Java generieren
>

>

In diesem Codebeispiel aufgrund der Ertrag Anweisung in ihrer Definition ist die Funktion open_file() eine Generatorfunktion . Wenn diese open_file()-Funktion aufgerufen wird, erstellt sie einen Ressourcendeskriptor namens file. Dieser Ressourcendeskriptor wird dann an den Aufrufer übergeben und hier durch die Variable my_file dargestellt. Nachdem der Code im With-Block ausgeführt wurde, kehrt die Programmsteuerung zur Funktion open_file() zurück. Die Funktion open_file() setzt ihre Ausführung fort und führt den Code aus, der auf die yield-Anweisung folgt. Dieser Teil des Codes, der nach der Yield-Anweisung erscheint, gibt die erworbenen Ressourcen frei. Der @contextmanager hier ist ein Dekorateur . Die vorherige klassenbasierte Implementierung und diese generatorbasierte Implementierung von Kontextmanagern sind intern identisch. Während letzteres besser lesbar erscheint, erfordert es Kenntnisse über Generatoren, Dekorateure und Ertrag.