Erstellen Benutzerdefinierter Kontextmanager
Swipe um das Menü anzuzeigen
Um die volle Leistungsfähigkeit von Context Managern in Python auszuschöpfen, kann eine eigene Klasse erstellt werden, die die Methoden __enter__ und __exit__ implementiert. Die Methode __enter__ wird aufgerufen, wenn die Ausführung in den Kontext des with-Statements eintritt, und ihr Rückgabewert wird der Variablen nach as zugewiesen. Die Methode __exit__ wird aufgerufen, wenn die Ausführung den Kontext verlässt, unabhängig davon, ob dies regulär oder aufgrund einer Ausnahme geschieht. Dieses Design ermöglicht es, Ressourcen sicher und vorhersehbar einzurichten und wieder freizugeben, was besonders beim Umgang mit Dateien, Netzwerkverbindungen oder Sperren nützlich ist.
Die Methode __exit__ erhält drei Argumente: exc_type, exc_value und traceback. Diese liefern Details zu einer eventuell im Kontextblock aufgetretenen Ausnahme. Gibt __exit__ True zurück, wird die Ausnahme unterdrückt; andernfalls wird die Ausnahme nach der Bereinigung weitergegeben. Durch die Implementierung dieser Methoden kann die Logik für das Einrichten und Aufräumen von Ressourcen präzise gesteuert werden, was den Code robuster und wartbarer macht.
class FileLogger:
def __init__(self, filename, logname):
self.filename = filename
self.logname = logname
self.file = None
self.log = None
def __enter__(self):
self.file = open(self.filename, "r")
self.log = open(self.logname, "a")
self.log.write(f"Opened file: {self.filename}\n")
return self.file
def __exit__(self, exc_type, exc_value, traceback):
if self.file:
self.file.close()
self.log.write(f"Closed file: {self.filename}\n")
if self.log:
self.log.close()
# Do not suppress exceptions
return False
Der folgende Code demonstriert eine benutzerdefinierte Context-Manager-Klasse FileLogger. Diese Klasse ist dafür konzipiert, eine Zieldatei zum Lesen und eine Logdatei zum Anhängen von Logeinträgen zu öffnen. Beim Eintritt in den Kontext (mittels with-Statement) wird das Öffnen der Datei protokolliert. Beim Verlassen des Kontexts – unabhängig davon, ob dies regulär oder durch eine Ausnahme geschieht – wird das Schließen der Datei protokolliert und sichergestellt, dass beide Dateien ordnungsgemäß geschlossen werden. Die Methode __exit__ unterdrückt keine Ausnahmen, sodass diese nach der Bereinigung weitergegeben werden.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen