5

スタイルガイドの最後のポイントhttp://www.python.org/dev/peps/pep-0008

読みます...

== を使用してブール値を True または False と比較しないでください。

なんで?

編集私が何を求めているのかを明確にするために(そしてそれは問題自体を示しています)、あなたが書くとき

if something:
    print "something is true"

true の意味に応じて機能する場合と機能しない場合があるブール値への暗黙的な変換を行っています。IMHOこの形式のプログラミングは、それが引き起こす可能性のある副作用のためにお勧めできません。

numberOfApples = -1
if numberOfApples:
    print "you have apples" # is not what is intended.

if numberOfApples == True:
    print "you have apples" # is also not what is intended.

iHaveApples = numberOfApples > 0
if iHaveApples is True:    # Edit:  corrected this.. the "is" is better than the ==
  print  "you have apples" # is correct.

暗黙的な変換により、論理エラーが隠蔽されます。では、なぜスタイルガイドはこれを奨励しているのでしょうか?

4

4 に答える 4

7

それはあなたが書くべきであることを意味します

if greeting:

それ以外の:

if greeting == True:

同様に、これも書くべきではありません:

if (greeting == True) == True:

余分なテストは冗長であり、コードに値を追加しないため、削除する必要があります。

于 2012-04-19T06:11:24.577 に答える
2

IMHOスタイルガイドのポイントは、いくつかの一般的な構造を理にかなった方法で標準化することです。そのため、最終的に同じことを行う非常に異なるステートメントになってしまうことはありません。さらに、異常な形式は、プログラマーが別の方法で物事を行う何らかの理由があることを示唆している可能性があります。おそらく、彼はステートメントのように見えるものとは異なる何かを達成しようとしていたのでしょう。

ステートメントの真偽をテストしたい場合は、ステートメント自体を使用するか、前にnot. ステートメントがTrueor 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 と一致します (したがって、考慮されます)。いくつかの例:TrueFalse__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
于 2012-04-19T06:31:30.267 に答える
1

冗長だからです。

if hasChildren:

と同じです

if hasChildren == True:

しかし、より簡潔で読みやすくなっています。

于 2012-04-19T06:11:32.960 に答える
0

順番に:

# A, Good:
if numberOfApples > 0:
    print "you have apples"

# B, Also good:
iHaveApples = numberOfApples > 0
if iHaveApples:
  print  "you have apples"

# C, Bad:
iHaveApples = numberOfApples > 0
if iHaveApples == True:
  print  "you have apples"

AやBではなくCを選ぶ理由は何ですか?

アップデート:

いくつかのまれなケースに苦労していると思いますが、それらのコーナーケースがプロジェクトで重要な場合は、適切な比較を使用してください。一般に、 の型についてある程度はわかっています。iHaveApplesたとえば、 を使用した比較の結果であることはわかってい>ます。コードでその情報を使用することは合理的であり、良い習慣だと私は信じています。「bool だと思ったら int か何か他のものだったらどうしよう」と尋ねている場合。コードにバグがあると言うよりも、それを見つけて修正し、同じ間違いを再び犯した場合に備えてテストを作成する必要があります。実行時に間違いを見つけるために Python に頼らないでください。

私は主張し、必要に応じて証明するのはあなたに任せます。これif iHaveApples:はまったく同じように動作しますが、それがブール値if iHaveApples is True:であることが確実にわかっている場合と同様に、より高速に実行されます。最後に、少なくとも私の意見では、望ましくない動作が発生するiHaveApples場合の例を示します。is

>>> import numpy
>>> totalApples = numpy.sum([1, 2, 3]) == 6
>>> totalApples
True
>>> totalApples is True
False

必要に応じて、それが機能しない理由を理解させます (ヒント、チェックしてくださいtype(totalApples))。

于 2012-04-23T06:26:45.370 に答える