“ with”でコードを条件付きで実行するにはどうすればよいですかブロック?
-
05-07-2019 - |
質問
これはちょっと機能を乱用していると思いますが、それができるかどうかはまだ知りたいです。 私は次のようなことをしたいです:
with conditional(a):
print 1
a == Trueの場合にのみ print 1
部分が実行されるようにします。
これは可能ですか?
編集: 以下に述べる人々のように、これは恐ろしいスタイルです。それは単なるなぞなぞの質問です。心の弱い人などのためではなく、自宅でこれを試さないでください。
解決
条件は if
ステートメントを使用して既に提供されているため、これを行う本当の理由はありません。
if a == True:
print 1
しかし、楽しいを求めているだけなら、答えはできませんです。 with
コンテンツの実行を停止するには、 _enter __
メソッドで conditional
が何らかの方法で実行を停止する必要があります。しかし、それを行う唯一の方法は、例外を発生させることです。つまり、ケースを処理するための try
ステートメントで with
をラップしない限り、他のコードは実行されません。 a!= True
編集: OPの条件( a == True
)を使用するためのコメントと投票で起訴されたことを確認し、 if a
。もちろん、Pythonの条件テスト用のイディオムです。しかし、私たちはOPが何を念頭に置いていたかを知りません、そして彼が本当に a
をブール値にしたいのか、そして > a = [1]
( if a
を渡します)そのままにしておくことにしました。
他のヒント
if a is True:
print 1
with
ステートメント信頼できる出入口コンテキストを提供することを目的としています。
唯一の方法は、引数がfalseの場合に conditional
で例外を発生させることです。 with
本体は実行されませんが、もちろん次のコードは実行されません-もちろん except
または finally
節まで。
__enter__および__exit__関数を持つクラスAがあるとします:
class A:
def __init__(self, i):
self.b = i
def __exit__(*args, **kwargs):
print "exit"
def __enter__(*args, **kwargs):
print "enter"
そして、オブジェクトcのbが1に等しいかどうかをチェックする関数B、そうでない場合は合格します。
def b(c):
if c.b == 1:
return c
else:
pass
達成できること:
with b(A(1)):
print 10
enter
10
exit
しかし、bが with に何も機能しないので渡すと、AttributeErrorがスローされます。
解決策は、 with b(A(1)):
をtry / exceptブロック内に配置することです。しかし、これを行うことはお勧めしません。