Python では、次のような構成を作成することが有効です。
def a():
return 0
if a:
print "Function object was considered True"
else:
print "Function object was considered False"
関数ポインターが True に評価されるロジックは何ですか。
この種の構文が言語に挿入されたのはなぜですか?
Python では、次のような構成を作成することが有効です。
def a():
return 0
if a:
print "Function object was considered True"
else:
print "Function object was considered False"
関数ポインターが True に評価されるロジックは何ですか。
この種の構文が言語に挿入されたのはなぜですか?
多くのものTrue
が Python で評価されます。ブール演算子に関するドキュメントから:
ブール演算のコンテキストで、また制御フロー ステートメントで式が使用される場合、次の値は false として解釈されます:
False
、None
、すべての型の数値ゼロ、および空の文字列とコンテナー (文字列、タプル、リスト、辞書、セットを含む)およびフリーズセット)。他のすべての値は true として解釈されます。
Python の関数は、他の多くのものと同様にオブジェクトであり、空ではありません。したがって、ブール値のコンテキストでは、True と評価されます。
「真実性」を評価するためのルールは、 Python ドキュメントのTruth Value Testingの章にあります。
特に注意してください
他のすべての値は true と見なされます。したがって、多くの型のオブジェクトは常に true です。
結論は; 関数オブジェクトは常に true です。
Python で False になるオブジェクトのリスト:
None
[]
{}
empty set
empty frozenset
False
0
0.0
0L
0j
defaultdict
Classes
メソッドを実装__nonzero__()
し、偽の値を返すもの、それ以外の場合__len__()
は呼び出されます。Python 3x__bool__()
では__nonzero__()
.@Magnus Hoff がリンクしている Truth Value Testing で、最も有益なステートメントは次のとおりであることがわかりました。
デフォルトでは、オブジェクトで呼び出されたときにFalse を返す_ bool _() メソッドまたは0 を返す_ len _() メソッドがそのクラスで定義されていない限り、オブジェクトは true と見なされます。
私は自分のクラスを定義しようとしましたが、_ bool _() が _ len _() よりも優先されるようです。これは理にかなっています:
class Falsish(object):
def __init__(self):
self.val = "False, even though len(self) > 0"
def __bool__(self):
return False
def __len__(self):
return 2
class StillFalsish(object):
def __init__(self):
self.val = "False, even though len(self) > 0"
def __len__(self):
return 2
def __bool__(self):
return False
class Truish(object):
def __init__(self):
self.val = "True, even though len(self) = 0"
def __bool__(self):
return True
def __len__(self):
return 0
class StillTruish(object):
def __init__(self):
self.val = "True, even though len(self) = 0"
def __len__(self):
return 0
def __bool__(self):
return True
class NowFalsish(object):
def __init__(self):
self.val = "False, with no __bool__(), since len(self) = 0"
def __len__(self):
return 0
class NowTruish(object):
def __init__(self):
self.val = "True, with no __bool__(), since len(self) > 0"
def __len__(self):
return 2
class EvenThisIsTruish(object):
pass
mybool1 = Falsish()
mybool2 = StillFalsish()
mybool3 = Truish()
mybool4 = StillTruish()
mybool5 = NowFalsish()
mybool6 = NowTruish()
mybool7 = EvenThisIsTruish()
if mybool1: print("mybool1 is true")
if mybool2: print("mybool2 is true")
if mybool3: print("mybool3 is true")
if mybool4: print("mybool4 is true")
if mybool5: print("mybool5 is true")
if mybool6: print("mybool6 is true")
if mybool7: print("mybool7 is true")
上記のコードの出力は次のとおりです。
mybool3 is true
mybool4 is true
mybool6 is true
mybool7 is true