“ with”でコードを条件付きで実行するにはどうすればよいですかブロック?

StackOverflow https://stackoverflow.com/questions/1808675

  •  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ブロック内に配置することです。しかし、これを行うことはお勧めしません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top