web-dev-qa-db-ja.com

Python booleans-if x :, vs if x == True、vs if x is True

これは以前に尋ねられましたが、私のexact質問への回答を無駄に検索してしまった場合は申し訳ありません。基本的に、Python 2.7では、一連のジオプロセシングツールを実行するプログラムがあります。これは、ユーザーがスクリプトで調整する一連のTrue/False変数によって要求されるものに依存します。

x = True

if x:
    run function

ただし、関数を実行するためにxを文字通り「True」にする必要はないことを発見しました。例えば:

In: x = True
    if x:
        print True

Out: True

In: x = 123
    if x:
        print True

Out: True

In: x = 'False'
    if x:
        print True

Out: True

In: x = False
    if x:
        print True

Out: 

したがって、False以外の値はTrueと評価されるように見えますが、x == Trueまたはif xはTrueの場合は当てはまりません。 PEP 8がif x:バリアントのみを使用することを強く推奨しているのを見て、この動作が発生する理由を誰でも説明できますか? x:が「xがFalseでない場合」または「xが存在する場合」のテストであるようです。そのことを念頭に置いて、xがTrueの場合は使用する必要があると考えています。この場合、PEP 8が言っていることにもかかわらずです。

敬具

21
ssast

Python)の次の値は、ifおよびその他の論理コンテキストのコンテキストではfalseです。

  • False
  • None
  • 00.0-0.0などの0に等しい数値
  • 空の文字列:''およびu''
  • 空のコンテナ(リスト、タプル、辞書など)
  • __bool__(Python3)を実装してFalseを返すもの、または__nonzero__(Python2)を実装してFalseまたは0を返すもの。
  • __bool__(Python3)または__nonzero__(Python2)を実装しないが、__len__を実装して0に等しい値を返すもの

オブジェクトは、それらが実際にFalseまたはTrueと等しいか同一かどうかに関係なく、それらのいずれかが当てはまる場合は「false」とみなされ、そうでない場合は「true」とみなされます。

さて、xが必然的にオブジェクトTrueまたはFalseのいずれかになるように調整した場合、if xを安全に記述できます。タイプに関係なく、xの「真」が操作を実行するかどうかを示すように調整している場合は、if xを安全に記述できます。あなたがそれを書くことができる場所は、読みやすいので、そうすることを好むべきです。

通常、xが値Trueをとることが許可されている場合、これらの2つのケースのいずれかに該当するため、if x is Trueを記述しません。重要なことは、xの意味を正しく文書化して、コードで使用されるテストを反映することです。

Pythonプログラマーは、真と見なされるものを知っていることが期待されるため、文書化するだけで「xが真の場合に関数を実行する」と、元のコードの動作を表します。それを文書化すると、「x is Trueの場合に関数を実行します」の意味は異なります。特定の値Trueではなく、真偽をテストするというPEP8のスタイル規則により、あまり一般的に使用されません。 。

ただし、xNoneである場合と空のコンテナである場合のコードの動作を変えたい場合は、if x is not Noneのようなものを記述します。

27
Steve Jessop
x = 'False'
x = 123

両方ともTrue

その他の真理値

このドキュメントでは、他の値について説明しています。

PEP8の理由に関しては、if this_file_is_green

3
Jakob Bowyer

その他の偽の値には、0''[]が含まれます。 if x:バージョンのみを使用する必要があります。

1
U2EF1

言うまでもなく、必要なことを行うコードを作成する必要があります。ただし、ほとんどの場合、Trueを他の「真の」値と区別する必要がないため、単に== Trueまたはis Trueと言う必要はありません。そのため、簡単にするためにこれを省略することをお勧めします。

必ず== Trueまたはis Trueを使用する必要があるのは、doTrueを他の真実の値と区別する必要がある場合です。

あなたの例では、True123の違いに関心がありますか?それはそれをコーディングする方法を教えてくれます。

== Trueまたはis Trueのコーディングに関する1つのこと:他の開発者があなたのコードを読むとき、それはマイナーな赤旗を上げます。彼らはそれが間違っているとは思わず、なぜそこにあるのか疑問に思うだけで、この特定のケースでTrueを他の真実の値と異なるように扱うことが重要である理由を知りたいと思うでしょう。

言い換えれば、必要ない場合は使用しないのが最善です。

1
Michael Geary

言う能力

_if x:
   ...
_

機能と見なされます。また、ユーザー定義クラスのテストに合格するかどうかを指定することもできます(メソッド___nonzero___ in Python 2.xまたは___bool___ in = Python 3)。

たとえば、文字列やリスト、辞書、セットなどのコンテナの場合、_if x ..._は「xが空でない場合」を意味します。

理由は、これによりコードの記述が少なくなるということではなく、結果のコードの方が読みやすく、理解しやすいことに注意してください。

代わりに_if x is True ..._を書きたい場合は、そのパスをさらに下ってif (x is True) is True ...またはif ((x is True) is True) is True ...に進むことを検討しましたか? :-)

0
6502