Ich plane, eine C ++ - ähnliche Konstruktor / Destruktor-Funktionalität in eine meiner Python-Klassen zu implementieren, indem ich das handliche benutze Aussage. Ich bin bisher nur für Datei-IO über diese Aussage gekommen, aber ich dachte, dass es auch für verbindungsbasierte Kommunikationsaufgaben hilfreich wäre, sagen wir Sockets oder Datenbankverbindungen . Dinge, die irgendwann geschlossen werden müssen.
In PEP 343 (oben verlinkt) heißt es, dass with
die Methoden __enter__
und __exit__
benötigt und meine direkte Implementierung scheint so zu funktionieren, wie ich es will.
Was die Ausgabe liefert (wie erwartet):
%Vor%Sollte es wirklich so einfach sein? Was sind die Dinge zu beachten? Warum haben so viele Bibliotheken (apparent) diese Funktionalität noch nicht? Habe ich etwas verpasst?
(a) Es ist so einfach
(b) Ein alternativer Ansatz ist eine Decorator-Funktion, die Funktionen (und Klassen, aber nicht für diesen Anwendungsfall) deko- riert und außerdem den Aufruf von Code sowohl vor als auch nach der umhüllten Funktion ermöglicht. Diese scheinen etwas häufiger.
(c) Ich glaube nicht, dass Sie etwas verpassen.
Ein Problem, auf das ich stieß, als ich versuchte, "mit" -Funktionalität in meinen Bibliotheken zu implementieren, ist die Suche nach einer eleganten Methode zur Behandlung von Fehlerausnahmen. Angesichts der folgenden:
%Vor%Was ist die empfohlene Methode für den Umgang mit dem unvermeidlichen "IOError: [Errno 2] Keine solche Datei oder Verzeichnis: './does_not_exist.txt'" Ausnahme? Es gibt immer den Ansatz "Versuch / Ausnahme"
%Vor%Dieser direkte Ansatz funktioniert, aber ich denke, dass er von der Einfachheit der Verwendung des 'mit' Konstrukts ablenkt. Vielleicht hat jemand da draußen eine elegantere Lösung?
Dies ist eher eine Frage als eine Antwort, aber es ist eines der Probleme, mit denen ich bei der Implementierung von "mit" konfrontiert wurde.
Tags und Links python with-statement