Viele von uns haben diesen Codeausschnitt immer wieder im Python-Code gesehen:
with open('Hi.text', 'w') as f: f.write("Hello, there")
Allerdings wissen einige von uns nicht, wofür „with“ verwendet wird und warum wir es hier verwenden müssen. In dieser Lektüre erfahren Sie mehr über fast jedes Problem, mit dem Sie es lösen können. Fangen wir an!
Lass uns zunächst darüber nachdenken, was wir tun müssen, ohne das Schlüsselwort with zu verwenden. In diesem Fall müssen wir zuerst die Datei öffnen und versuchen zu schreiben. Unabhängig von Erfolg oder Misserfolg schließen wir es besser am Ende, damit unser Code so aussieht:
f = open('Hi.text', 'w') try: f.write('Hello, there') finally: f.close()
Also, wozu dient das Schlüsselwort with? Es hilft nur, unseren try..finally-Code auf eine einzige with...-Anweisung zu verkürzen! So wird die with-Anweisung verwendet.
Also, was genau ist das? Tatsächlich ist die with-Anweisung selbst in Python nichts Besonderes, sie ist lediglich eine Funktion des Kontextmanagers in Python. Ein Kontextmanager, zitiert aus der offiziellen Python-Dokumentation, ist eine Möglichkeit, Ihnen zu ermöglichen, Ressourcen genau dann zuzuweisen und freizugeben, wenn sie benötigt werden, oder einfach ausgedrückt: Kürzen Sie Ihr Code-Snippet, wenn Sie etwas an einer Ressource tun, was bedeutet, dass Sie dann die Verwendung definieren können der with-Anweisung selbst!
Wie machen wir das? Nun, es ist ganz einfach, Sie müssen nur zwei magische Funktionen implementieren: eine namens __enter__ und die andere namens __exit__. Die erste Möglichkeit besteht darin, eine Klasse zu schreiben, die diese beiden Funktionen implementiert, wie unten gezeigt:
class My_file: def __init__(self, fname): self.fname = fname def __enter__(self): self.file = open(self.fname, 'w') return self.file def __exit__(self, exc_type, exc_val, exc_trace_back): if self.file: self.file.close()
Hier haben wir eine normale Python-Klasse erstellt, die die beiden magischen Funktionen implementiert. Beachten Sie die Signaturen dieser beiden Funktionen: __enter__ akzeptiert nur self , während __exit__ mehr Argumente akzeptiert, die drei im Beispiel sind die Standardform. Auf diese Weise können wir Folgendes direkt verwenden:
with My_file('hello.txt') as f: f.write('hello, world!')
Die with-Anweisung hier ruft zuerst __init__ auf, um ein neues Objekt zu erstellen, und ruft dann die __enter__-Methode auf, bevor der Codeblock abgeschlossen ist. Das ungefähre Äquivalent des obigen Codes lautet also wie folgt:
myfile = My_file('hello.txt') f = myfile.__enter__() f.write('hello, world!') myfile.__exit(...)
Die zweite Möglichkeit, einen Kontextmanager zu implementieren, ist über einen Dekorator wie folgt:
Lassen Sie uns gemäß der obigen Einführung einen Dekorator-Kontextmanager schreiben!
from contextlib import contextmanager @contextmanager def my_file_open(fname): try: f = open(fname, 'w') yield f finally: print('Closing file') f.close() with file_open('hi.txt') as f: f.write('hello world')
Das Obige deckt so ziemlich alle Grundlagen von Statements und Kontextmanagern ab, aber wenn Sie mehr erfahren möchten, machen Sie weiter...!
contextlib verfügt über einige praktische Tools, die Sie verwenden können. Der erste schließt sich. Beim Schließen wird Ihr Codeblock grundsätzlich mit einer anderen Funktion umschlossen, die Sie vor dem Beenden implementieren.
@contextmanager def closing(f): try: f.write("Finish writing") finally: f.close() with closing(open("hi.text")): f.write("hello world")
Zum Beispiel können wir im obigen Code direkt close(your_way_of_getting_resource) aufrufen und kurz bevor der Codeblock, den Sie unten geschrieben haben, fertig ist (f.write("hello world")), wird er try ausführen. .endlich verwenden wir den oben definierten Block.
Die andere Möglichkeit besteht darin, das Unterdrückungstool zu verwenden. Wir wissen, dass es in vielen Fällen wahrscheinlich ist, dass beim Öffnen der Datei Fehler wie FileNotFoundException auftreten, wenn wir versuchen, einige Ressourcen abzurufen. In manchen Fällen möchten wir Fehler abfangen oder unterdrücken, damit das Programm normal weiterlaufen kann. Unterdrücken ist eine Möglichkeit, Warnungen zu unterdrücken. Alles, was Sie tun müssen, ist herauszufinden, welche Ausnahme Sie unterdrücken möchten, und mit suppress(your_choice_of_Exception) zu schreiben, und Python kümmert sich von dort aus darum.
In anderen Fällen möchten Sie möglicherweise nur bestimmte Aktionen ausführen, wenn Sie einen With-Block eingeben. In diesem Fall ist nullcontext für Sie praktisch. nullcontext gibt nur das zurück, was Sie in der Funktion __enter__ definiert haben, und führt keine weiteren Aktionen aus. Wenn Sie mit asynchronen Vorgängen in Python arbeiten, um auf Ressourcen zuzugreifen, ist aclosure ein Dienstprogramm zur Bewältigung dieser Situation.
In diesem Artikel werden einige grundlegende Konzepte und die Verwendung der with-Anweisung sowie das zugrunde liegende Funktionsprinzip vorgestellt. Es gibt noch viel mehr Interessantes, schauen Sie sich die contextlib-Dokumentation von Python an. Abschließend wünsche ich Ihnen wie immer viel Spaß beim Lernen und viel Spaß beim Programmieren!
Das obige ist der detaillierte Inhalt vonEntmystifizierung des with-Schlüsselworts in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!