Ich bin auf der Suche nach Logik für Datenbanktransaktionen in einen with
Block zu verkapseln; Wrapping des Codes in einer Transaktion und Behandlung verschiedener Ausnahmen (Locking-Probleme). Das ist einfach genug, aber ich möchte auch, dass der Block das Wiederholen des Codeblocks nach bestimmten Ausnahmen kapselt. Ich kann keinen Weg sehen, dies ordentlich in den Kontextmanager zu verpacken.Encapsulating Wiederholungen in `mit` Block
Ist es möglich, den Code innerhalb einer with
Anweisung zu wiederholen?
Ich möchte es so einfach verwenden, das ist wirklich ordentlich.
def do_work():
...
# This is ideal!
with transaction(retries=3):
# Atomic DB statements
...
...
ich derzeit Umgang dies mit einem Dekorateur, aber ich würde es vorziehen, den Kontext-Manager zu bieten (oder beides in der Tat), so kann ich wählen stattdessen im with
Block ein paar Zeilen Code wickeln einer Inline-Funktion in einem Dekorateur eingewickelt, das ist das, was ich im Moment tun:
def do_work():
...
# This is not ideal!
@transaction(retries=3)
def _perform_in_transaction():
# Atomic DB statements
...
_perform_in_transaction()
...
http://docs.python.org/release/2.5/whatsnew/pep-343.html sieht aus wie es Beispiele auf hat, wie man einen Kontext-Manager zu implementieren. – Vlad