IMHOスタイルガイドのポイントは、いくつかの一般的な構造を理にかなった方法で標準化することです。そのため、最終的に同じことを行う非常に異なるステートメントになってしまうことはありません。さらに、異常な形式は、プログラマーが別の方法で物事を行う何らかの理由があることを示唆している可能性があります。おそらく、彼はステートメントのように見えるものとは異なる何かを達成しようとしていたのでしょう。
ステートメントの真偽をテストしたい場合は、ステートメント自体を使用するか、前にnot
. ステートメントがTrue
or False
(真/偽の値だけでなく) に評価されることを確認する必要がある場合はstatement is True
、(スタイル ガイドでは推奨されていませんが) を使用するか、その型を ( を使用してisinstance
) チェックすることができます。しかし、それは通常悪い設計です。そうするかなりの理由がない限り、それを避けるべきです。
使用statement == True
は多くの理由で危険です: 1) でのみ動作しTrue
、他の「真の」値 ( など[1]
) では失敗します。2) ステートメントによって返される値が を再定義すると、予期しない結果が生じる可能性があり__eq__
ます。__nonzero__
3) 引数の順序が変更された場合などに、異なる結果が生成される可能性があります。値がorを実装している場合、ステートメントを使用するだけでも、truehood/falsehood に対して異なる値が返される可能性があることに注意してください。ただし、__len__
通常の使用では、通常は問題になりません。
スタイルから逸脱した場合に、物事がいかに混乱するかを示すいくつかの例:
if True: print True # True
if 1: print True # True
if [1]: print True # True
True is True # True
1 is True # False
[1] is True # False
True == True # True
1 == True # True
[1] == True # False
編集:もう少し:
if 1: print True # True
if 2: print True # True
1 == True # True
2 == True # False
1 is True # False
2 is True # False
更新: @Marcin が指摘したように、値を/bool
に強制するために使用でき、それらの値のみが存在することを保証します。その関数の結果は、値のデフォルトの true/false と一致します (したがって、考慮されます)。いくつかの例:True
False
__nonzero__
__len__
if bool(1): print True # True
bool(1) == True # True
bool(1) is True # True
if bool(2): print True # True
bool(2) == True # True
bool(2) is True # True
1 or 2 # 1
1 and 2 # 2
bool(1) or bool(2) # True
bool(1) and bool(2) # True
bool(1) == bool(2) # True
bool(1) is bool(2) # True