私が得ることができる最も近いものは、次のような 2 つのネストされたコンテキスト マネージャーを使用することです。
class SkippedException(Exception):
pass
class SkipContext:
def __enter__(self):
pass
def __exit__(self, type, value, tb):
return type is SkippedException
class SomeContext:
def __init__(self, arg):
self.arg = arg
def __enter__(self):
if self.arg == 1:
print "arg", self.arg
raise SkippedException()
def __exit__(self, type, value, tb):
pass
with SkipContext(), SomeContext(1):
print "body"
マネージャーは基本的に、 の場合に内部マネージャーによって発生したSkipContext
をキャッチします。SkippedException
SomeContext
arg == 1
複数のコンテキスト式の構文は、Python 2.7 以降でのみサポートされていることに注意してください。以前のバージョンでは、次のように記述する必要がありました。
with SkipContext():
with SomeContext(1):
print "body"
ドキュメントのcontextlib.nested
主張にもかかわらず、コンテキスト マネージャーは、with
例外が 内からスローされた場合、上記のネストされたステートメントのセマンティクスと正確には一致__enter__
しないため、この場合は機能しません。
PEP 343では、フロー制御を隠すマクロ (コンテキスト マネージャーなど) は推奨されないと述べており、非表示のフロー制御に対する Raymond Chen の暴言を参照していることに注意してください。