博客專欄

EEPW首頁 > 博客 > Python數(shù)據(jù)類型判斷存在問題總結(jié)

Python數(shù)據(jù)類型判斷存在問題總結(jié)

發(fā)布人:扣丁學(xué)堂 時間:2020-06-22 來源:工程師 發(fā)布文章

  今天扣丁學(xué)堂小編給大家介紹一下關(guān)于python視頻教程之判斷變量數(shù)據(jù)類型時,建議使用isinstance()方法代替type().進(jìn)行類型檢查首先想到的就是用type(),但是Type在某些特定情況下判斷類型存在問題,今天就來說下type在python類型判斷時的坑。

1.jpeg

  type()方法


  例子:int類型判斷


  >>>importtypes


  >>>type(2017)==types.IntType


  True


  Python2.7中的types類型:


  types.BooleanType#bool類型


  types.BufferType#buffer類型


  types.BuiltinFunctionType#內(nèi)建函數(shù),比如len()


  types.BuiltinMethodType#內(nèi)建方法,指的是類中的方法


  types.ClassType#類類型


  types.CodeType#代碼塊類型


  types.ComplexType#復(fù)數(shù)類型


  types.DictProxyType#字典代理類型


  types.DictType#字典類型


  types.DictionaryType#字典備用的類型


  types.EllipsisType


  types.FileType#文件類型


  types.FloatType#浮點類型


  types.FrameType


  types.FunctionType#函數(shù)類型


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


  types.MemberDescriptorType


  types.MethodType


  types.ModuleType


  types.SimpleNamespace


  types.TracebackType


  types.new_class


  types.prepare_class


  Python3.x進(jìn)行了類型的精簡


  isinstance方法


  isinstance(object,classinfo)object表示實例,classinfo可以是直接或間接類名、基本類型或者有它們組成的元組。


  >>>isinstance(1,int)


  True


  >>>


  >>>isinstance('pythontab.com',(str,int))#是其中一種即可


  True


  >>>isinstance(100,(str,int))#是其中一種即可


  True


  上面type的例子可以表示為:


  >>>importtypes


  >>>isinstance(2017,int)


  True


  那為什么不推薦使用type進(jìn)行類型檢查呢?我們來看一下下面的例子。


  importtypes


  classUserInt(int):


  def__init__(self,val=0):


  self.val=int(val)


  i=1


  n=UserInt(2)


  print(type(i)istype(n))


  上面的代碼輸出:False


  這就說明i和n的類型是不一樣的,而實際上UserInt是繼承自int的,所以這個判斷是存在問題的,當(dāng)我們對Python內(nèi)建類型進(jìn)行擴展的時候,type返回的結(jié)果就不夠準(zhǔn)確了。我們再看一個例子。


  classca:


  pass


  classcb:


  pass


  a=ca()


  b=cb()


  print(type(a)istype(b))


  代碼的輸出結(jié)果:True


  注意:這個例子僅僅針對Python2.x版本,Python3.x版本中會返回Flase,不存在該問題


  type比較的結(jié)果a和b的類型是一樣的,結(jié)果明顯是不準(zhǔn)確的。在old-styleclass中,任意instance的type都是'instance'。所以絕對不能用type來判斷其類型。


  另外這個問題又與Python的思想有關(guān),正常情況下不應(yīng)該編寫代碼檢查類型的,而應(yīng)該直接假設(shè)被操作的instance具有你希望的屬性,否則拋出異常。即使需要檢查類型,也應(yīng)該用isinstance來判斷,這樣你期望類型的subclass也能正常被處理(比如,一個函數(shù)需要處理Message類型,那么它應(yīng)該也能處理Message的子類型MyMessage,所以應(yīng)該使用isinstance(arg,Message)這樣來判斷而不是type(arg)==Message來判斷)


  小編提醒:盡量不要使用type()方法,多使用isinstance(),這樣可以減少錯誤,最后想要學(xué)習(xí)Python培訓(xùn)課程的小伙伴快選擇扣丁學(xué)堂學(xué)習(xí)吧,扣丁學(xué)堂不僅有專業(yè)的老師還有與時俱進(jìn)的課程體系和大量的Python視頻供學(xué)員觀看學(xué)習(xí)哦。


*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。

LCD顯示屏相關(guān)文章:lcd顯示屏原理


lcd相關(guān)文章:lcd原理


關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉