Ich muss ein dateiähnliches Objekt in Python öffnen (es ist eine serielle Verbindung über / dev /) und es dann schließen. Dies geschieht mehrmals in verschiedenen Methoden meiner Klasse. Ich habe die Datei im Konstruktor geöffnet und dann im Destruktor geschlossen. Ich bekomme allerdings seltsame Fehler und ich denke, das hat mit dem Garbage Collector zu tun. Ich bin es immer noch nicht gewohnt, nicht genau zu wissen, wann meine Objekte gelöscht werden = \
Der Grund, warum ich das getan habe, ist, dass ich tcsetattr
jedes Mal, wenn ich es öffne, eine Reihe von Parametern verwenden muss und es nervig wird, all das überall zu tun. Ich möchte also eine innere Klasse implementieren, um all das zu handhaben, damit ich sie verwenden kann
with Meter('/dev/ttyS2') as m:
Ich habe online gesucht und konnte keine wirklich gute Antwort darauf finden, wie die with
Syntax implementiert ist. Ich habe gesehen, dass es die __enter__(self)
und __exit(self)__
Methoden verwendet. Aber ist alles, was ich tun muss, um diese Methoden zu implementieren, und ich kann die mit Syntax verwenden? Oder steckt noch mehr dahinter?
Gibt es entweder ein Beispiel dafür oder eine Dokumentation darüber, wie es bereits auf Dateiobjekten implementiert ist, die ich mir ansehen kann?
quelle
def __enter__(self): return self
Wenn Sie einen Verweis aufMeter
den with-Block wünschen .Am einfachsten ist es, die Kontextlib des Standard-Python-Bibliotheksmoduls zu verwenden :
import contextlib @contextlib.contextmanager def themeter(name): theobj = Meter(name) yield theobj theobj.close() # or whatever you need to do at exit
Dies macht sich nicht zu
Meter
einem Kontextmanager (und ist daher für diese Klasse nicht invasiv), sondern "dekoriert" sie (nicht im Sinne von Pythons "Dekoratorsyntax", sondern fast, aber nicht ganz im Sinne des Dekorateur Entwurfsmuster ;-) mit einer Fabrik Funktion ,themeter
die ist ein Kontext - Manager (das ist dercontextlib.contextmanager
Dekorateur aus dem „Single - Buildsyield
“ Generatorfunktion Sie schreiben) - das macht es so viel einfacher , das Ein- und Aussteigen Zustand zu trennen, vermeidet Verschachtelung & c.quelle
theobj.close()
es auch im Ausnahmefall ausgeführt wird, können Sieyield theobj
mit einemtry...finally
Block umbrechen.Der erste Google-Hit (für mich) erklärt es einfach genug:
http://effbot.org/zone/python-with-statement.htm
und das PEP erklärt es genauer (aber auch ausführlicher):
http://www.python.org/dev/peps/pep-0343/
quelle