久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

專欄中心

EEPW首頁 > 專欄 > Python數據類型判斷存在問題總結

Python數據類型判斷存在問題總結

發布人:扣丁學堂 時間:2020-06-22 來源:工程師 發布文章

  今天扣丁學堂小編給大家介紹一下關于python視頻教程之判斷變量數據類型時,建議使用isinstance()方法代替type().進行類型檢查首先想到的就是用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#內建函數,比如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.MappingProxyType


  types.MemberDescriptorType


  types.MethodType


  types.ModuleType


  types.SimpleNamespace


  types.TracebackType


  types.new_class


  types.prepare_class


  Python3.x進行了類型的精簡


  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進行類型檢查呢?我們來看一下下面的例子。


  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的,所以這個判斷是存在問題的,當我們對Python內建類型進行擴展的時候,type返回的結果就不夠準確了。我們再看一個例子。


  classca:


  pass


  classcb:


  pass


  a=ca()


  b=cb()


  print(type(a)istype(b))


  代碼的輸出結果:True


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


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


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


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


*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。

關鍵詞:

相關推薦

利用Wiegand能量收集技術為物聯網設備供能

決戰希臘:微軟“創新杯”2009實況-——軟件設計和嵌入式開發項目組決賽4

視頻 2009-07-08

鼎陽科技全新推出模塊化產品組合,構建新一代模塊化、軟件定義的測試平臺

為綠色未來而刻畫

模塊化汽車連接器支持分區架構——以及更多

Altera: 采用全系列40-nm收發器FPGA和ASIC實現創新

視頻 2009-07-13

Bourns 發布新一代熱跳線芯片系列 以微型化設計提升散熱效能

Meta擬將AI智能眼鏡產能翻倍 年產量或直沖2000萬副

智能計算 2026-01-14

ATmega48/V ATmega88/V ATmega168/V

決戰希臘:微軟“創新杯”2009實況-——軟件設計和嵌入式開發項目組決賽1

視頻 2009-07-07

at89lv51

英偉達因AI芯片熱潮將與三星的差距拉大530億美元

國際視野 2026-01-14

決戰希臘:微軟“創新杯”2009實況-——軟件設計和嵌入式開發項目組決賽3

視頻 2009-07-08

決戰希臘:微軟“創新杯”2009實況-——軟件設計和嵌入式開發項目組決賽2

視頻 2009-07-07

Arm 成立 Physical AI 業務部門:從“算力架構”走向“現實世界”的關鍵一躍

智能計算 2026-01-14

ATmega169 atmega169l atmega169v

Donut Lab的“固態電池”可能是真的

bmp文件格式分析及其編程

美國政府批準向中國出口英偉達H200芯片

AMI8563I2C 實時時鐘/日歷芯片

更多 培訓課堂
更多 焦點
更多 視頻

技術專區