专栏中心

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视频供学员观看学习哦。


专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

台积电重申1.4nm级工艺技术不需要高数值孔径EUV

乐享科技获亿级天使+轮融资,锦秋基金领投押注家庭具身智能机器人!

25个关节+葡萄缝合!灵犀X2机器人量产倒计时

Mobileye成像雷达在SAE 3级低能见度驾驶中获胜

H形燃料电池可能是未来交通的动力解决方案

嵌入式Linux内核裁减与移植 上

视频 2009-10-26

10BASE-T1S 以太网——连接物理世界和数字世界

小型风冷LED UV光源可提高固化性能

IC与LCD的常见连接方式

可配置的驱动器为跛行回家模式增加了额外的安全引脚

iCAN系列产品选型指南

人工智能能否使关键通信芯片的设计更简单?

FPGA在视频处理领域的应用 上

视频 2009-10-26

FPGA在视频处理领域的应用 下

视频 2009-10-26

嵌入式Linux图形界面开发 下

视频 2009-10-26

嵌入式Linux内核裁减与移植 下

视频 2009-10-26

imec 的 300 毫米射频硅中介平台在基于芯片 let 的异构集成中展示了高达 325GHz 的创纪录低插入损耗

ICD932编程调试器使用指南

更多 培训课堂
更多 焦点
更多 视频

技术专区