私が以下を持っている場合:
if a(my_var) and b(my_var):
do something
の場合にb()
のみ評価されると仮定できますか? それとも最初に行うのでしょうか?a()
True
b()
isb()
の場合、評価すると例外が発生するため、質問します。a()
False
私が以下を持っている場合:
if a(my_var) and b(my_var):
do something
の場合にb()
のみ評価されると仮定できますか? それとも最初に行うのでしょうか?a()
True
b()
isb()
の場合、評価すると例外が発生するため、質問します。a()
False
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'
うん、そうすれば安全です。条件が遅延評価される場合の Python。