これは以前に尋ねられましたが、私の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が言っていることにもかかわらずです。
敬具
Python)の次の値は、if
およびその他の論理コンテキストのコンテキストではfalseです。
False
None
0
、0.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のスタイル規則により、あまり一般的に使用されません。 。
ただし、x
がNone
である場合と空のコンテナである場合のコードの動作を変えたい場合は、if x is not None
のようなものを記述します。
その他の偽の値には、0
、''
、[]
が含まれます。 if x:
バージョンのみを使用する必要があります。
言うまでもなく、必要なことを行うコードを作成する必要があります。ただし、ほとんどの場合、True
を他の「真の」値と区別する必要がないため、単に== True
またはis True
と言う必要はありません。そのため、簡単にするためにこれを省略することをお勧めします。
必ず== True
またはis True
を使用する必要があるのは、doがTrue
を他の真実の値と区別する必要がある場合です。
あなたの例では、True
と123
の違いに関心がありますか?それはそれをコーディングする方法を教えてくれます。
== True
またはis True
のコーディングに関する1つのこと:他の開発者があなたのコードを読むとき、それはマイナーな赤旗を上げます。彼らはそれが間違っているとは思わず、なぜそこにあるのか疑問に思うだけで、この特定のケースでTrue
を他の真実の値と異なるように扱うことが重要である理由を知りたいと思うでしょう。
言い換えれば、必要ない場合は使用しないのが最善です。
言う能力
_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 ...
に進むことを検討しましたか? :-)