私は常にif not value
のスタイルでコーディングしてきましたが、このスタイルが機能している間、2つの潜在的な問題があるように見えるいくつかのガイドが私の注意を喚起しました:
if value is None
の方がわかりやすいでしょう。[]
や0
などもFalse
と評価されるため、これは後で影響を与える可能性があります(そして、微妙なバグを引き起こす可能性があります)。このアイデアを他の比較にも適用し始めています。
if not value
vs if value is False
if not value
vs if value is []
リストもそうです...
問題は、原則をどこまで進めるかです。コードを安全に保ちながらどこに線を引くか?
何があっても常にif value is None
スタイルを使用する必要がありますか?
必要な場合は、Noneと比較してください。値がfalse(空のリスト、なし、false)と見なされるかどうかを確認するだけの場合は、「値でない場合」を使用します。
「価値がない場合」は見た目がきれいでPythonicであると思います。
また、リストには注意してください。空のリストを比較するときは使用しないでください。リストを取得していることがわかっている場合は、「if」を使用して、リストにコンテンツ(またはlen())があるかどうかを確認します。これをインタプリタに入力してみてください:
>>> a = []
>>> a is []
False
これは、作成した一時リストのメモリ内のアドレスが「a」に保存されているアドレスと異なるためです。 None、False、Trueではこれらが表示されません。これらはすべてシングルトンの値であり(すべてメモリの同じセクションを参照)、 'is'キーワードを使用すると機能します。
また、CPythonが文字列をインターンするので、次のように動作します。
>>> 'a' is 'a'
True
notこれに依存する必要があります。これは実装の詳細であり、すべてのバージョンのPythonで動作するように指定されているわけではありません。
いいえ。値がfalseであるがNone
ではないときにコードを実行したい場合、これはひどく失敗します。
使用する is None
None
オブジェクトとの同一性をチェックする場合。使用する not value
値をFalseにするだけの場合。
is
演算子の使用には少し問題があります。たとえば、同じアイデンティティを持つ2つのアクティブなリストがないため、if value is []
は常にfalseになります。 None
はシングルトン(None
へのすべての参照は同じオブジェクト)であるため、None
とうまく連携しますが、他の比較には==
を使用します。
ただし、if value
とif not value
は完全に読み取り可能で便利です。 IMHOより具体的にする必要はありませんnless 0とNone
を区別するなど、さまざまなタイプの真偽値を異なる方法で処理する必要があります。
ほとんどのコーディングの問題に当てはまるので、私の答えは単純です。動作するものを記述しようとしないでください。意図をできるだけ明確に表現してください。値がfalseかどうかを確認する場合は、if not value
を使用します。 None
を確認する場合は、書き留めてください。それは常に状況とあなたの判断に依存します。
考えずに適用できるルールを見つけようとするべきではありません。これらのルールを見つけたら、それは人間ではなくコンピュータの仕事です! ;-)
if not value:
pass
元気で「Pythonic」です。微妙なバグは発生しません。ルールは明示的であり、(私は見つけます) 理解しやすい です。
使用について述べたように、FalseとNoneを区別する必要がある場合:
if not value is None: # or False, or == [], etc.
pass
# more readable
if value is not None: # or False, or != [], etc.
pass
私は上記がめったに必要としないことを見つけます。
一般に、ポジティブな条件を作成し、それらを最初に置くことが推奨されます。それらは一目で理解しやすく、複雑さの増加に対応できます(常にそうであるように)。
if value:
pass
else:
pass