問題:我必須檢查返回的值是否是Python字典。如何在Python中正確檢查對象類型?
Q1。以下哪個選項是正確的方法?
type(x) == dict
type(x) == type(dict)
isinstance(d, dict)
再就是使用is
操盤==
的其他變體。 Q2302。 Many people表示檢查對象的類型通常是不好的做法,但對於我最初的問題,我有其他選擇嗎?
問題:我必須檢查返回的值是否是Python字典。如何在Python中正確檢查對象類型?
Q1。以下哪個選項是正確的方法?
type(x) == dict
type(x) == type(dict)
isinstance(d, dict)
再就是使用is
操盤==
的其他變體。 Q2302。 Many people表示檢查對象的類型通常是不好的做法,但對於我最初的問題,我有其他選擇嗎?
Q1。以下哪個選項是正確的方法?
不要浪費時間進行類型檢查。
這很容易出錯,因爲它基於假設。第二季度銷售價格指數爲:
Q2。 ...我有其他選擇嗎?
是的。
try:
x.the_dict_operation()
except TypeError:
# x was not the expected type for the operation
raise # or whatever.
在大多數情況下,這相當於「無所事事」。
只需編寫代碼。如果「某種程度上」惡意的反社會人士使用了錯誤的類型,它就會像預期的那樣崩潰。
檢查__getitem__
而不是驗證類型。如果你真的想進行類型檢查,任何事情都沒有問題(好吧,除了type(x) == type(dict)
,對於dict
實例,這絕不會是真的)。 isinstance
可能是最標準的方法。
'__getitem__'與dict沒有任何關係。許多對象具有'__getitem__',它們不是字典。對於他在做的事情(檢查對象是否可以傳遞給'{} .update'),這是特別錯誤的:有些對象可以傳遞給那個沒有'__getitem__'的函數。他想檢查對象是否可迭代。 –
@Glenn它需要是可迭代的,這樣迭代元素纔是可迭代的,因此每個元素都有2個元素。 :) –
依靠行爲,而不是實際類型(見其他答案)。
很多對象可以像字典一樣行事,你不想強迫你的函數/ API的用戶使用普通的字典,對吧?
在務實的一面:
>>> type({})
<type 'dict'>
>>> dict
<type 'dict'>
>>> type(dict)
<type 'type'>
>>> isinstance({}, dict)
True
>>> isinstance("", dict)
False
你需要它是一個字典或者你需要訪問它的項目? – GaretJax
無論如何,你鏈接的問題已經提供了答案。 – GaretJax
@Garet我需要成爲一本字典,因爲我會用它來更新另一個字典。 – Paolo