2011-08-01 38 views
3

問題:我必須檢查返回的值是否是Python字典。如何在Python中正確檢查對象類型?

Q1。以下哪個選項是正確的方法?

type(x) == dict 

type(x) == type(dict) 

isinstance(d, dict) 

再就是使用is操盤==的其他變體。 Q2302。 Many people表示檢查對象的類型通常是不好的做法,但對於我最初的問題,我有其他選擇嗎?

+0

你需要它是一個字典或者你需要訪問它的項目? – GaretJax

+0

無論如何,你鏈接的問題已經提供了答案。 – GaretJax

+0

@Garet我需要成爲一本字典,因爲我會用它來更新另一個字典。 – Paolo

回答

8

Q1。以下哪個選項是正確的方法?

不要浪費時間進行類型檢查。

這很容易出錯,因爲它基於假設。第二季度銷售價格指數爲:

Q2。 ...我有其他選擇嗎?

是的。

try: 
    x.the_dict_operation() 
except TypeError: 
    # x was not the expected type for the operation 
    raise # or whatever. 

在大多數情況下,這相當於「無所事事」。

只需編寫代碼。如果「某種程度上」惡意的反社會人士使用了錯誤的類型,它就會像預期的那樣崩潰。

+0

+1非常感謝,現在我真的明白「鴨子打字」的意義。 – Paolo

+0

這樣我就不得不相信x.the_dict_operation方法仍然會做它應該做的事情(在我的例子中是另一個字典的簡單更新。)。這不是一個潛在的問題嗎? – Paolo

+0

@Guandalino:由於您使用用戶提供的詞典來更新您自己的詞典,因此您自己的詞典的'.update()'方法會被調用。如果你不能相信... – kindall

1

檢查__getitem__而不是驗證類型。如果你真的想進行類型檢查,任何事情都沒有問題(好吧,除了type(x) == type(dict),對於dict實例,這絕不會是真的)。 isinstance可能是最標準的方法。

+0

'__getitem__'與dict沒有任何關係。許多對象具有'__getitem__',它們不是字典。對於他在做的事情(檢查對象是否可以傳遞給'{} .update'),這是特別錯誤的:有些對象可以傳遞給那個沒有'__getitem__'的函數。他想檢查對象是否可迭代。 –

+0

@Glenn它需要是可迭代的,這樣迭代元素纔是可迭代的,因此每個元素都有2個元素。 :) –

2

依靠行爲,而不是實際類型(見其他答案)。

很多對象可以像字典一樣行事,你不想強迫你的函數/ API的用戶使用普通的字典,對吧?

在務實的一面:

>>> type({}) 
<type 'dict'> 
>>> dict 
<type 'dict'> 
>>> type(dict) 
<type 'type'> 
>>> isinstance({}, dict) 
True 
>>> isinstance("", dict) 
False