2011-08-22 52 views
26

我一直在if not value風格編碼,但是,有少數的導遊都引起了我的注意,雖然這種風格的作品,它似乎有2個潛在的問題:的Python:如果沒有VAL,VS如果val是無

  1. 它不完全可讀; if value is None肯定更容易理解。
  2. 這可能會影響以後(並導致微妙的錯誤),因爲像[]0也將評估爲False

我也開始這個想法應用到其他的比較,如:

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

所以那張列表...

問題是,你用p去多遠rinciple?在哪裏畫線,同時保持您的代碼安全?

無論如何,我應該總是使用if value is None風格嗎?

+0

Pythons的寫作學科之一是**鴨**打字。在'None'的情況下,'[]','0'等等意味着'如果某件事看起來像什麼都沒有,那麼它就沒有任何作用。'如果你需要更加明確被測試的值,那麼使用''==。 – nagisa

回答

11

使用比較無,如果這就是你想要的。如果您只想檢查該值是否爲false(空列表,無,錯誤),請使用「if not value」。

我覺得「如果沒有價值」更清潔的前瞻性和Python的。

另外,請小心列表。比較空列表時,不應該使用is。如果你知道你得到一個列表,使用「if」來檢查它是否有任何內容(或len())。試着輸入到這個解釋:

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

這是因爲您剛纔提出的臨時列表在內存比一個儲存在「A」不同的地址。你沒有看到這與None,False或True,因爲這些都是單身的值(他們都指的是相同的內存部分),所以使用'is'關鍵字的作品。

你還會發現,CPython的實習生串所以下面的作品。

>>> 'a' is 'a' 
True 

你應該靠這個。這是一個實現細節,並沒有指定使用每個版本的Python。

+0

好的。剛剛學到了一些關於「is」操作符的新知識。 :)從一些更多的研究中,我發現'如果不是'適合於像'0'和'[]'和'False'這樣的東西,並且如所說的,如果None的值爲None。有道理,因爲「如果不是」將始終是布爾值,但「無」的「如果不是」則是不同的故事,因此「如果值爲無」。 :) –

16

不可以。如果你想運行代碼時,該值爲假但不是None,這將會失敗可怕。

如果您正在檢查與None對象的身份,請使用is None。如果您只想將值設爲False,請使用not value

1

我的答案很簡單,因爲它適用於大多數的編碼問題:不要試圖寫出一些正常工作的東西。儘可能清楚地表達你的意圖。如果您想檢查一個值是否爲假,請使用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 []將始終爲假,因爲沒有兩個活動列表具有相同的身份。它的偉大工程與None因爲None是一個單獨的(以None所有引用同一個對象),但其他比較,使用==

然而,if valueif not value是完全可讀的和有用的。恕我直言,沒有必要更具體,除非需要區別對待不同類型的truthy或falsy值,因爲,例如,0和None區分。