2011-08-22 12 views
26

私はいつもif not valueのスタイルでコード化していますが、このスタイルは機能するものの、2つの潜在的な問題があるようです。Python:valでない場合、valがNoneの場合

  1. 完全に読み込めません。 if value is Noneは確かに理解できます。
  2. これは、[]0のようなものがFalseと同様に評価されるため、後で影響を受ける可能性があり(微妙なバグを引き起こす可能性があります)。

は、私はまたのような他の比較、この考え方を適用するために始めています:

  • if not value

if value is []

  • if not valueif value is False VSとそのリストが行きます...

    質問は、どのくらいpに行っていますか?何か?あなたのコードを安全に保ちながら、どこに線を引くのですか?

    私はいつもif value is Noneスタイルを使用する必要がありますか?

  • +0

    Pythons執筆分野の1つは、** duck ** typingです。 「None」、「[]」、「0」などの場合は、「何かが何のようにも見えない場合は何もしません」ということを意味します。テストされる値をより明確にする必要がある場合は、 '=='。 – nagisa

    答えて

    11

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

    「価値がない場合」は、洗剤とPythonicに見えます。

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

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

    あなただけ作られた一時的なリストは、「A」に格納されているものよりも、メモリ内の異なるアドレスを持っているためです。これはNone、False、またはTrueで表示されません。これらはすべてシングルトン(すべてが同じメモリセクションを参照する)なので、 'is'キーワードを使用しているためです。

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

    >>> 'a' is 'a' 
    True 
    

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

    +0

    良いキャッチ。 'is'演算子について何か新しいことを学んだだけです。 :)もう少し研究したところ、 '' not 'は '0'と' [] 'や' False'のようなものに適しており、 'None'の場合は' value is None'と判明しました。もしそうでなければ常にブール値であるが、 'None'の' if'は別のストーリーであるため、 'if value is None'という意味になります。 :) –

    16

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

    Noneオブジェクトで身元を確認する場合は、is Noneを使用してください。値をFalseにしたい場合はnot valueを使用してください。

    1

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

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

    1
    if not value: 
        pass 
    

    は「pythonic」です。微妙なバグは発生しません。規則は明示されています(私が見つける)easy to understand

    あなたが使用したように、偽となしを区別する必要がある場合:

    if not value is None: # or False, or == [], etc. 
        pass 
    

    を私も上記のことはほとんど必要ありません見つけます。

    しかし、一般に、陽性条件を作ることが好ましい。彼らは一見して理解しやすく、複雑さが増すにつれて(常にそうであるように)容易に持ちこたえます。

    if value: 
        pass 
    else: 
        pass 
    
    +0

    だからこそ、私はそれが微妙なバグを引き起こすかもしれないと言ったのです。私はむしろ詳細には行きませんが、この[post](http://boodebr.org/main/python/tourist/none-empty-nothing)で説明してください。 :) –

    +0

    申し訳ありませんが、正しいテストを決めて適用する必要があります。リンクされたブログの投稿は、Pythonの真理テストのルールを理解しておらず、代わりにCを使用したい人です。 「微妙な」バグは、ルールを理解できないときに起こるものです。 –

    4

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

    ただし、if valueif not valueは完全に読みやすく有用です。たとえば、の場合、0とNoneの間を区別するなど、様々な種類の真偽値または偽値を別々に扱う必要がある場合を除き、より具体的にする必要はありません。

    関連する問題