web-dev-qa-db-ja.com

Python:valでない場合とvalがNoneの場合

私は常にif not valueのスタイルでコーディングしてきましたが、このスタイルが機能している間、2つの潜在的な問題があるように見えるいくつかのガイドが私の注意を喚起しました:

  1. 完全に読めるわけではありません。 if value is Noneの方がわかりやすいでしょう。
  2. []0などもFalseと評価されるため、これは後で影響を与える可能性があります(そして、微妙なバグを引き起こす可能性があります)。

このアイデアを他の比較にも適用し始めています。

  • if not value vs if value is False
  • if not value vs if value is []

リストもそうです...

問題は、原則をどこまで進めるかです。コードを安全に保ちながらどこに線を引くか?

何があっても常にif value is Noneスタイルを使用する必要がありますか?

53
John Doe

必要な場合は、Noneと比較してください。値がfalse(空のリスト、なし、false)と見なされるかどうかを確認するだけの場合は、「値でない場合」を使用します。

「価値がない場合」は見た目がきれいでPythonicであると思います。

また、リストには注意してください。空のリストを比較するときは使用しないでください。リストを取得していることがわかっている場合は、「if」を使用して、リストにコンテンツ(またはlen())があるかどうかを確認します。これをインタプリタに入力してみてください:

>>> a = []
>>> a is []
False

これは、作成した一時リストのメモリ内のアドレスが「a」に保存されているアドレスと異なるためです。 None、False、Trueではこれらが表示されません。これらはすべてシングルトンの値であり(すべてメモリの同じセクションを参照)、 'is'キーワードを使用すると機能します。

また、CPythonが文字列をインターンするので、次のように動作します。

>>> 'a' is 'a'
True

notこれに依存する必要があります。これは実装の詳細であり、すべてのバージョンのPythonで動作するように指定されているわけではありません。

24

いいえ。値がfalseであるがNoneではないときにコードを実行したい場合、これはひどく失敗します。

使用する is NoneNoneオブジェクトとの同一性をチェックする場合。使用する not value値をFalseにするだけの場合。

25
Wooble

is演算子の使用には少し問題があります。たとえば、同じアイデンティティを持つ2つのアクティブなリストがないため、if value is []は常にfalseになります。 Noneはシングルトン(Noneへのすべての参照は同じオブジェクト)であるため、Noneとうまく連携しますが、他の比較には==を使用します。

ただし、if valueif not valueは完全に読み取り可能で便利です。 IMHOより具体的にする必要はありませんnless 0とNoneを区別するなど、さまざまなタイプの真偽値を異なる方法で処理する必要があります。

4
kindall

ほとんどのコーディングの問題に当てはまるので、私の答えは単純です。動作するものを記述しようとしないでください。意図をできるだけ明確に表現してください。値がfalseかどうかを確認する場合は、if not valueを使用します。 Noneを確認する場合は、書き留めてください。それは常に状況とあなたの判断に依存します。

考えずに適用できるルールを見つけようとするべきではありません。これらのルールを見つけたら、それは人間ではなくコンピュータの仕事です! ;-)

3
Achim
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
1
Gringo Suave