4

私が以下を持っている場合:

if a(my_var) and b(my_var):
    do something

の場合にb()のみ評価されると仮定できますか? それとも最初に行うのでしょうか?a()Trueb()

isb()の場合、評価すると例外が発生するため、質問します。a()False

4

4 に答える 4

7

b()a(my_var)はいの場合にのみ評価されTrueます。が falseyandの場合、演算子は短絡します。a(my_var)

ブール演算子のドキュメントから:

x and yは最初に評価されxます。が false の場合x、その値が返されます。それ以外の場合yは評価され、結果の値が返されます。

呼び出されたときに何かを出力する関数を使用して、これを自分でテストできます。

>>> def noisy(retval):
...     print "Called, returning {!r}".format(retval)
...     return retval
... 
>>> noisy(True) and noisy('whatever')
Called, returning True
Called, returning 'whatever'
'whatever'
>>> noisy(False) and noisy('whatever')
Called, returning False
False

Python は空のコンテナーと数値 0 を false と見なします。

>>> noisy(0) and noisy('whatever')
Called, returning 0
0
>>> noisy('') and noisy('whatever')
Called, returning ''
''
>>> noisy({}) and noisy('whatever')
Called, returning {}
{}

カスタム クラスは、__nonzero__フックを実装して同じテストのブール フラグを返すか、代わりにコンテナー タイプの場合は__len__フックを実装できます。戻り0は、コンテナーが空であることを意味し、false と見なされます。

密接に関連して、orオペレーターは同じことを逆に行います。最初の式が true と評価された場合、2 番目の式は評価されません。

>>> noisy('Non-empty string is true') or noisy('whatever')
Called, returning 'Non-empty string is true'
'Non-empty string is true'
>>> noisy('') or noisy('But an empty string is false')
Called, returning ''
Called, returning 'But an empty string is false'
'But an empty string is false'
于 2013-06-21T09:35:42.860 に答える
1

うん、そうすれば安全です。条件が遅延評価される場合の Python。

于 2013-06-21T09:35:48.023 に答える