2016-01-22 77 views
4

來檢查None PEP8國家應該使用is None進行。一般來說,單身人士也是如此。但PEP8還指出,不應該使用操作符,is是甚至不如==進行平等真假:爲什麼使用「is」運算符比較True/False不好?

Yes: if greeting: 
No: if greeting == True: 
Worse: if greeting is True: 

我明白,第一個是最漂亮的,最Python的方式,但有時我發現自己的情況下,我想明確表明,我正在比較TrueFalseis在那種情況下如何比==差?

回答

4

等於運算符==可以通過類來實現的(以及所有其他的比較操作),但is不能。

可以定義一個類,使它的一些實例等於True,但它們仍然總是會失敗is True比較。考慮一個bool狀類,例如:

class MyBool: 
    def __init__(self, is_true): 
     self.is_true = bool(is_true) 

    def __eq__(self, other): 
     return self.is_true == bool(other) 

    def __bool__(self): 
     return self.is_true 

這個類可以確保一個實例a = MyBool(True),所有的if a:bool(a)a == True將表現正常。但是,a is True將返回False

+1

請注意'__bool__'是Python 3.X,Python 2.X等價物是'__nonzero__'。另外,如果你經歷了定義'__bool__'的麻煩,那麼'如果MyBool()'仍然是最pythonic真實性測試。 –

3

is是在這種情況下「雪上加霜」,因爲需要確切的對象。第一個建議允許最大的鴨子打字,第二個允許一些典型的truthy值,最後一個不允許任何鴨子打字。只有True單身人士會通過比較。

這種比較是成功的:

1 == True 

這種比較是不成功的:

1 is True 
+0

但是人們會嚴重懷疑你的能力,如果你寫的'如果COND ==真:'如果不是'如果COND:'或'如果COND ==錯誤:',而不是'如果不是COND:'。 – kay

+0

這是上面評論中可能重複問題中提到的最相關的事情。似乎最大的鴨子打字的原則是指導PEP8規範。 –

+0

@Kay壞習慣有深刻的根源。我發現自己也在其他語言中也這樣做。我會盡量記住避免這種情況,如果我覺得有必要在將來與真/假進行明確比較,可能會重新考慮我的變量/函數名稱。 –

相關問題