2012-08-07 21 views
12

の違い私のサイトでは、いくつかのクラス属性が定義されていて空でないかどうかを確認する必要があります。これまでのところ、私はを喜んで使用しました。私の考えでは、if self.attr is not None and self.attr is not '':の省略形であるか、属性の未定義値が何であれです。文字列と演算子:ベストプラクティス、+

これは問題なく動作しますが、複数の文字列属性をチェックすると驚くべき動作になります。 '' and ''False(期待通り)ではなく、''です。

これは、and演算子がタイプキャストをboolに強制しない他のタイプですか? この動作の違いがif句の実際の異なる結果を引き起こす例を考え出すことはできません(結局のところ、''はまだFalseと評価されます)。しかし、傷が残っています罠になる。

最後に、なぜそれがそのように実装されたのか誰かが知っているかどうか知りたいですか?私は、PythonのZenが片方向と片方だけを奨励し、+演算子がすでに文字列連結のための直感的な方法であると思っていました。

+1

ここにコードを挿入できますか? –

+1

答えはこれをカバーしていないようですが、質問のブール値の部分に焦点を当てていますが、 'and'は文字列の連結を決してしません。 '+'のようなものではありません。 – geoffspear

+1

['' .join'を使用して '+'ではなく文字列を連結します。](http://stackoverflow.com/questions/1349311/python-string-join-is-faster-than-but-whats-wrong-ここ/ 1350289#1350289) – unutbu

答えて

13

andブールへの型キャストは決してありません。むしろ、ifは式の結果についてbool()を呼び出します。それは式が最初のオペランドに基づいて、TrueまたはFalseに評価されないことを決定することができ

(そのことについて、およびorandを用いた発現、短絡、および最後の評価値を返します。

>>> 0 and 'string' 
0 
>>> 1 and 'string' 
'string' 
>>> 'string' or 10 
'string' 
>>> '' or 10 
10 

この '副作用'は、Pythonコードでよく使用されます。 notがブール値を返すことに注意してください。詳細については、python documentation on boolean operatorsを参照してください。

ドキュメントも、他のほとんどすべてはTrueに相当しながら、TrueまたはFalse様々なタイプの等価などNone0''Falseいる空容器を構成するものについて説明します。カスタムクラスの場合

、あなたは.__nonzero__() methodTrueまたはFalseを返す)または.__len__() methodは、そうでない場合、彼らはいつもよ、彼らのブール同等に影響を与えるために、(0Falseで、他のすべてがTrueあるint型を返す)を定義する必要がありますデフォルトはTrueです。

関連する問題