2012-08-07 40 views
12

的差異對於我的其中一個站點,我需要檢查是否定義了幾個類屬性而不是空的。到目前爲止,我很高興地使用if self.attr:,這在我看來是if self.attr is not None and self.attr is not '':的縮寫,或者是屬性的未定義值。字符串和運算符:最佳實踐,與+

這工作正常,但在檢查多個字符串屬性時產生令人驚訝的行爲。 '' and ''不是False(如我所料),但''

這引出了一個問題:and操作員是否還有其他類型的操作員不強制將類型轉換爲bool? 我不能拿出一個例子,這種行爲上的差異會導致if條款的實際不同結果(畢竟,''仍然評估爲False),但我們仍然覺得有邊緣案例可能成爲一個陷阱。

最後,我很想知道是否有人知道它爲什麼以這種方式實現?我認爲Python的禪宗只鼓勵一種方式,一種方式,並且運算符似乎是字符串連接的直觀方式。

+1

你可以把代碼放在這裏嗎? – 2012-08-07 12:48:50

+1

答案似乎沒有涵蓋這個問題,側重於問題的布爾部分,但'和'從來沒有字符串連接;它根本不像'+'。 – geoffspear 2012-08-07 13:09:27

+1

[使用'''.join'連接字符串,而不是'+'。](http://stackoverflow.com/questions/1349311/python-string-join-is-faster-than-but-whats-wrong-這裏/ 1350289#1350289) – unutbu 2012-08-07 13:14:12

回答

13

and從來沒有類型轉換爲布爾值。相反,if對錶達式的結果調用bool()

使用and(和or,就此而言)的表達,短路時,它能夠確定的是,表達不會評價爲True或基於所述第一操作數False,並且返回最後一個評價值:

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

這種「副作用」通常用於python代碼。請注意0​​確實返回一個布爾值。有關詳細信息,請參閱python documentation on boolean operators

該文檔還解釋了什麼是TrueFalse相當於各種類型,如None0''和空集裝箱被False,而大多數其他一切等同於True

對於定製類,你需要定義.__nonzero__() method(返回TrueFalse)或.__len__() method(返回一個int,其中0False和其他一切是True),以影響他們的布爾等價的,否則他們將永遠默認爲True