2011-08-12 24 views
10

これらのアプローチの間に、実装レベルに関連した低レベルの実装(パフォーマンス)がありますか?Python:Noneのテスト、ブール値のテスト

例えば
# check if string is empty 
# the preferred way it seems [1] 
if string: 
    print string 
else: 
    print "It's empty." 

# versus [2] 
if string is '': 

# or [3] 
if string == '': 

Noneのためにテストするとき、私はまだやってそれをより読みやすく、明確な見つける:少なくとも

if not some_var: 

if not some_var ...の

if some_var is not None: 

..instead、私にとっては、「some_varが存在しない場合は常に」と読みます。

==,isとbool-testingの正しい使用例は何ですか?

答えて

8

(値)同等性テストにはisを使用しないでください。オブジェクトIDのテストにのみ使用してください。例if string is ''の場合は動作するかもしれませんが、これは実装に依存しており、依存することはできません。

>>> a = "hi" 
>>> a is "hi" 
True 
>>> a = "hi there!" 
>>> a is "hi there!" 
False 

それ以外は、コードの意味を伝えるものを使用してください。

私はより短いif string:を好むが、if string != '':がより明白かもしれない。

その後、再びif variable:オブジェクトのすべての種類の作品なので、variableは1種類に限定されていない場合、これはif variable != "" and variable != 0:よりも優れているなどまず

+1

大変、ありがとうございます。そして、「あなたのコードの意味を伝えるものを何でも使ってください」 - これはコーディング時やソリューションを守る際に考慮すべき素晴らしいことです。 – maligree

2

、これが動作することが保証されていないためif string is '':を使用していません。 CPythonが短い文字列をインターンするということは実装の詳細なので、依存してはいけません。

が空でないことを確認するためにif string:を使用すると、私はそれを行うためのPythonicの方法だと思います。

しかし、if string == ''については、が間違っているがありません。 stringがTrueと評価された場合に

if string: 
    print string 

このテストを:ティムPietzckerの答えに拡大すること

+0

よかった、素晴らしい。あなたは 'CPython internsの短い文字列'を拡張することができますか、どこかで私がより多くの情報を得ることができますか? – maligree

+0

http://en.wikipedia.org/wiki/String_interningは始める場所になります:) –

+0

...私はばかばかしいです。半分眠っていなければなりません。ありがとう! – maligree

5

。 I.

>>> bool("") 
False 
>>> bool(None) 
False 
>>> bool("test") 
True 

だから、それが空であるかどうかはテストしていますだけでなく、Noneまたは空の場合。これは、None/emptyをどのように扱うかによって、影響を受ける可能性があります。

関連する問題