Sto cercando di incapsulare la logica per le transazioni del database in un blocco with
; avvolgere il codice in una transazione e gestire varie eccezioni (problemi di blocco). Questo è abbastanza semplice, tuttavia mi piacerebbe anche che il blocco incapsulasse il nuovo tentativo del blocco di codice dopo alcune eccezioni. Non riesco a vedere un modo per impacchettarlo ordinatamente nel gestore del contesto.Esegui l'incapsulamento dei tentativi nel blocco `with`
È possibile ripetere il codice all'interno di una dichiarazione with
?
Mi piacerebbe usarlo semplicemente come questo, che è veramente pulito.
def do_work():
...
# This is ideal!
with transaction(retries=3):
# Atomic DB statements
...
...
Attualmente sto manipolazione di questo con un decoratore, ma preferirei di offrire al gestore di contesto (o di fatto entrambi), in modo da poter scegliere di avvolgere un paio di righe di codice nel blocco with
invece di una funzione inline avvolto in un decoratore, che è quello che faccio in questo momento:
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 sembra che ha esempi su come implementare un gestore di contesto. – Vlad