Я хочу инкапсулировать логику транзакций базы данных в блок with
; обертывание кода в транзакции и обработка различных исключений (проблемы с блокировкой). Это достаточно просто, однако я бы также хотел, чтобы блок инкапсулировал повторную попытку блока кода после определенных исключений. Я не вижу способа аккуратно упаковать это в диспетчер контекста.
Можно ли повторить код в операторе with
?
Я бы хотел использовать его так просто, что действительно здорово.
def do_work():
...
# This is ideal!
with transaction(retries=3):
# Atomic DB statements
...
...
В настоящее время я обрабатываю это с помощью декоратора, но я бы предпочел предложить диспетчер контекста (или фактически и то, и другое), поэтому я могу обернуть несколько строк кода в блоке with
вместо встроенной функции, заключенной в декоратор, чем я сейчас и занимаюсь:
def do_work():
...
# This is not ideal!
@transaction(retries=3)
def _perform_in_transaction():
# Atomic DB statements
...
_perform_in_transaction()
...