Worauf ist bei der Verwendung der with-Anweisung für eigene Klassen zu achten?

8

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.

%Vor%

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?

    
moooeeeep 18.01.2012, 10:58
quelle

2 Antworten

5

(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.

    
Marcin 18.01.2012, 11:03
quelle
0

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.

    
JS. 18.01.2012 22:46
quelle

Tags und Links