Ich habe einen lang laufenden Prozess namens Updater, an den Aktualisierungen (für ein ETL-System) übermittelt werden. Die Updates haben Ressourcenanforderungen, die durch Hinzufügen eines Kontextmanagers zum ExitStack des Updaters verwaltet werden. Einige Updates beinhalten eine neue Konfiguration, was bedeutet, dass betroffene Ressourcen aus dem Stapel freigegeben werden müssen und eine neu konfigurierte Version der Ressource hinzugefügt wird. Ich brauche so etwas wie:
Code: Select all
with ExitStack() as stack:
ctx_manager = open("file.txt")
f = stack.enter_context(ctx_manager)
...
ctx_pop(ctx_manager, stack) # remove the given context manager from the stack
Unten ist ein Beispiel für etwas, das ich zum Laufen gebracht habe, das jedoch auf den Zugriff auf geschützte Mitglieder angewiesen ist. Ich hatte gehofft, dass es eine weniger „schmutzige“ Lösung als diese geben könnte:
Code: Select all
def ctx_pop(cm, stack):
for item in stack._exit_callbacks:
if item.__self__ is cm:
break
else:
raise KeyError(repr(cm))
stack._exit_callbacks.remove(item)
item(None, None, None)
Bearbeiten: Bekannte Lösung hinzugefügt