2013-06-19 87 views
19

在Python你有None單,其作用非常奇怪在某些情況下:無Python錯誤/錯誤?

>>> a = None 
>>> type(a) 
<type 'NoneType'> 
>>> isinstance(a,None) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types 

所以第一關,<type 'NoneType'>顯示該None不是一個類型,但NoneType是。然而,當你運行isinstance(a,NoneType),它有一個錯誤響應:NameError: name 'NoneType' is not defined

現在,鑑於這一點,如果你有一個輸入的默認設置爲None的函數,需要檢查,你會做以下幾點:

if variable is None: 
    #do something 
else: 
    #do something 

什麼是我不能做以下代替的原因:

if isinstance(variable,None): #or NoneType 
    #do something 
else: 
    #do something 

我只是尋找一個詳細的解釋,所以我可以更好地理解這個

編輯:良好的應用

可以說,我想用isinstance,這樣我可以做一些事情,如果variable是多種類型,包括None

if isinstance(variable,(None,str,float)): 
    #do something 
+2

'if variable == None' is anti-idiomatic Python。做這個測試的標準方法是利用'None'是一個單獨的事實:使用'if變量爲None'來代替。 –

回答

28

你可以試試:

>>> variable = None 
>>> isinstance(variable,type(None)) 
True 
>>> variable = True 
>>> isinstance(variable,type(None)) 
False 

isinstance需要兩個參數isinstance(object, classinfo)這裏,通過傳遞None要設置classinfo到無,因此錯誤。你需要傳入類型。

4

None爲的只是一個值types.NoneType,這不是一種類型。

和錯誤是非常明顯的:

TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

docs

None is the sole value of types.NoneType . None is frequently used to represent the absence of a value, as when default arguments are not passed to a function.

您可以使用types.NoneType

>>> from types import NoneType 
>>> isinstance(None, NoneType) 
True 

is操作者也能正常工作:

>>> a = None 
>>> a is None 
True 
22

None不是一個類型,它是單例本身 - 而第二個參數isinstance必須是它們的類型,類或元組。因此,您需要使用types中的NoneType

from types import NoneType 
print isinstance(None, NoneType) 
print isinstance(None, (NoneType, str, float)) 
 
True 
True 

雖然,我會經常來傾斜x is None or isinstance(x, (str, float))更換isinstance(x, (NoneType, str, float))

+0

很好的答案和解釋,但我接受karthikr,因爲它不需要導入 –

+1

@RyanSaxe沒關係,我原諒你。但是如果你打算使用'NoneType',我只會從'types'中導入它。當您可以輕鬆訪問該值時,似乎沒有必要調用'type(None)'。 – arshajii

+1

類型中不再有NoneType引用。你可以使用'NoneType = type(None)' – Sadik

3

None是一個值(實例)而不是一個類型。如錯誤消息所示,isinstance期望第二個參數是一個類型。

的類型都不是type(None),或Nonetype如果導入它(from types import NoneType

注:慣用的方式做試驗variable is None。簡短和描述性。