Я хочу инкапсулировать логику транзакций базы данных в блок 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()
...