特定の条件が満たされたときに、強制的に早期に終了することができるコンテキストマネージャーを作成する必要があります。python3コンテキストマネージャー早期終了強制
詳細:
コンテキストマネージャは、リソースを解放/ロック/チェック処理する必要があります。 __enter__
で、コンテキストマネージャは、リソースがロックされているかどうかを確認する必要があります。そうであれば、文脈でコードを実行することなく__exit__
を呼びたいと思います。それ以外の場合、コンテキストマネージャはリソースを取得し、コンテキストコードを実行し、__exit__
でリソースをクリーンアップします。
それはこのようになります:
class my_context_manager:
def __enter__(self):
if resource_locked():
self.__exit__(None, ResourceLockedException(), None)
else:
acquire_resource()
def __exit__(self, *exc_info):
if not isinstance(exc_info[1], ResourceLockedException):
release_resource()
else:
log.warn("Resource already in use.")
上記のコード__enter__
の__exit__
内部の呼び出しが実行されてからのコンテキスト内のコードを停止していないため、実際には、しかし、動作しません。
また、__enter__
からResourceLockedException
をスローすることもできますが、__exit__
は呼び出されません。これは、コンテキストマネージャ自体から例外がスローされるためです。私は例外をキャッチし、警告を記録し、リソースがロックされている場合はコンテキストを入力できないようにしたいと思います。
これはコンテキストを早期にクローズする方法を見つけることになるため、__exit__
が呼び出され、コンテキストコードは実行されません。上記のどちらかの方法でこれを調整する方法はありますか?それとも別の方法がありますか?