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()
...