Python資料型別判斷常遇到的坑

2021-10-05 22:06:18 字數 4024 閱讀 1305

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...