python判斷變數資料型別時,建議使用isinstance()方法代替type(). 進行型別檢查首先想到的就是用type(),但是type在某些特定情況下判斷型別存在問題,今天就來說下type在python型別判斷時的坑。
例子: int型別判斷
>>
>
import types
>>
>
type
(2017
)==types.inttype
true
python2.7中的types型別:
types.booleantype # bool型別
types.buffertype # buffer型別
types.builtinfunctiontype # 內建函式,比如len()
types.builtinmethodtype # 內建方法,指的是類中的方法
types.classtype # 類型別
types.codetype # **塊型別
types.complextype # 複數型別
types.dictproxytype # 字典**型別
types.dicttype # 字典型別
types.dictionarytype # 字典備用的型別
types.ellipsistype
types.filetype # 檔案型別
types.floattype # 浮點型別
types.frametype
types.functiontype # 函式型別
types.generatortype
types.getsetdescriptortype
types.instancetype # 例項型別
types.inttype # int型別
types.lambdatype # lambda型別
types.listtype # 列表型別
types.longtype # long型別
types.memberdescriptortype
types.methodtype # 方法型別
types.moduletype # module型別
types.nonetype # none型別
types.notimplementedtype
types.objecttype # object型別
types.slicetypeh
types.stringtype # 字串型別
types.stringtypes
types.tracebacktype
types.tupletype # 元組型別
types.typetype # 型別本身
types.unboundmethodtype
types.unicodetype
types.xrangetype
python3.x中的types型別:
types.builtinfunctiontype
types.builtinmethodtype
types.codetype
types.dynamicclassattribute
types.frametype
types.functiontype
types.generatortype
types.getsetdescriptortype
types.lambdatype
types.memberdescriptortype
types.methodtype
types.moduletype
types.******namespace
types.tracebacktype
types.new_class
types.prepare_class
python3.x進行了型別的精簡
isinstance
(object
, classinfo)
object表示例項,classinfo可以是直接或間接類名、基本型別或者有它們組成的元組。
基本用法
>>
>
isinstance(1
,int
)true
>>
>
>>
>
isinstance
('pythontab.com',(
str,
int)
)# 是其中一種即可
true
>>
>
isinstance
(100,(
str,
int)
)# 是其中一種即可
true
上面type的例子可以表示為:
>>
>
import types
>>
>
isinstance
(2017,int
)true
我們來看一下下面的例子。
import types
class
userint
(int):
def__init__
(self, val=0)
: self.val =
int(val)
i =1
n = userint(2)
print
(type
(i)is
type
(n))
上面的**輸出:false
這就說明i和n的型別是不一樣的,而實際上userint是繼承自int的,所以這個判斷是存在問題的,當我們對python內建型別進行擴充套件的時候,type返回的結果就不夠準確了。我們再看乙個例子。
classca:
pass
classcb:
pass
a = ca(
)b = cb(
)print
(type
(a)is
type
(b))
**的輸出結果: true
注意: 這個例子僅僅針對python2.x版本, python3.x版本中會返回flase,不存在該問題
type比較的結果a和b的型別是一樣的,結果明顯是不準確的。在old-style class中,任意instance的type都是』instance』。所以絕對不能用type來判斷其型別。
另外這個問題又與python的思想有關,正常情況下不應該編寫**檢查型別的,而應該直接假設被操作的instance具有你希望的屬性,否則丟擲異常。即使需要檢查型別,也應該用isinstance來判斷,這樣你期望型別的subclass也能正常被處理(比如,乙個函式需要處理message型別,那麼它應該也能處理message的子型別mymessage,所以應該使用isinstance(arg,message)這樣來判斷而不是type(arg) == message來判斷)
結論:盡量不要使用type()方法,多使用isinstance(),這樣可以減少錯誤。
python 判斷資料型別
python 判斷資料型別有type和isinstance 基本區別在於 type 不會認為子類是父類 isinstance 會認為子類是父類型別 1 2 3 4 5 6 7 8 9 classcolor object pass classred color pass printtype color...
python 資料型別判斷
全部資料型別 int 整型 str 字串 float 浮點數 list 列表 tuple 元組 dict 字典 set 集合 isinstance方法判斷a input plz input a string if isinstance a,int print is int elif isinstan...
python 判斷資料型別
python 判斷資料型別有type和isinstance 基本區別在於 type 不會認為子類是父類 isinstance 會認為子類是父類型別 class color object pass class red color pass print type color color print ty...