本文中所有代码均运行在Python 2.7上

为什么要进行类型检查?

总所周知,Python是一门典型的动态语言,在变量定义、使用的过程中遵循duck typing,当对某一变量进行操作时才去检查它是否支持该操作。这在大多数情况下没有什么问题。但有时我们希望当面对非法类型的参数的时候采取某些默认处理机制,来提高程序的健壮性,而不是直接抛出异常停掉整个程序。

举个例子:

def list_add(list1, list2):

for item in list2:

list1.append(item)

return list1

上面是一个很简单的方法,将第二个列表中的元素依此追加在第一个列表之后。这要求list1变量类型支持append方法,list2变量本身是可迭代的。如果我们传入两个int类型的变量来调用这个方法,就会抛出TypeError的异常。

type

在进行类型检查的时候,大多数人至少都会知道使用type方法,这是比较常见的方法。

再来几个例子:

>>> import typea

>>> type(1) is types.IntType

True

>>> type(True) is types.booleanType

True

>>> type(1.22) is types.StringType

False

看起来不错,似乎可以应付绝大多数情况,但有的时候还是会有点问题:

import types

# 我们创建了一个继承自int的类,不进行任何重写,按照duck typing的原则,它应该被按照int进行处理

>>> class A(int):

... pass

>>> b = A()

>>> type(b) is types.IntType

False

可见,基于Python内建(bult-in)类型的自定义类型,python并不能返回我们期望的结果。

不仅如此,type对于古典类(古典类和新式类的区别)的类型判断似乎也有点问题:

>>> class A:

... pass

>>> class B:

... pass

>>> a = A()

>>> b = B()

>>> type(a) == type(b)

True

>>> type(a)

>>> type(b)

可见,对于所有古典类,type返回的结果是一样的。

综上所述,对于常见的内建类型,type可以返回我们期望的结果,但在某些情形下,似乎会有点问题。

isinstance

isinstance可以解决上面所提到的type可能存在的问题。

首先看一下常见情况下:

>>> isinstance(1, int)

True

>>> isinstance('Hello', basestring)

True

>>> isinstance(1.23, float)

True

>>> isinstance([1,2], dict)

False

接下来看看对于继承自内建类型的自定义类型的判断:

>>> class A(int):

... pass

>>> a = A()

>>> isinstance(a, int)

True

之后来看看古典类的情况:

>>> class A:

... pass

>>> class B:

... pass

>>> a = A()

>>> b = B()

>>> isinstance(a, A)

True

>>> isinstance(a, B)

False

>>> isinstance(b, B)

True

>>> isinstance(b, A)

False

得到了我们所期望的效果。

总结

鉴于在某些情况下,type()可能会出现的问题,为确保程序的正常运行,一般情况下推荐使用isinstance()来进行类型判断。

python参数类型检查_Python中的类型检查相关推荐

  1. python怎么显示提示_Python中的类型提示(中)

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 3.接口存根文件 这个选项允许你如下图一般保存你的代码: 并在原文件的旁边添加一个扩展名为pyi的文件: ...

  2. python布尔类型运算_Python中布尔类型

    我们已经了解了Python支持布尔类型的数据,布尔类型只有True和False两种值,但是布尔类型有以下几种运算: 与运算:只有两个布尔值都为 True 时,计算结果才为 True. True and ...

  3. python布尔类型运算_Python中布尔类型以及与或非运算

    与运算:只有两个布尔值都为 True 时,计算结果才为 True.True and True # ==> True True and False # ==> False False and ...

  4. python互相转换组合_Python中基本类型的连接组合和互相转换13种方式

    本篇总结了一下字符串,列表,字典,元组的连接组合使用和类型的互相转换小例子,尤其列表中的extend()方法和字典中的 update方法非常的常用. 1.连接两个字符串 a = "hello ...

  5. python 参数解析器_Python中最好用的命令行参数解析工具

    接下来只剩下 argparse 这一神器,它几乎能满足我对命令解析器的所有需求.它支持解析一参数多值,可以自动生成help命令和帮助文档,支持子解析器,支持限制参数取值范围等等功能. 身为老司机,还是 ...

  6. python算法和数据结构_Python中的数据结构和算法

    python算法和数据结构 To 至 Leonardo da Vinci 达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this ar ...

  7. python变量类型函数_python中的变量和数据类型

    一.变量定义:变量是计算机内存中的一块区域,存储规定范围内的值,值 可以改变,通俗的说变量就是给数据起个名字. 二.变量命名规则: 1. 变量名由字母.数字.下划线组成 2. 数字不能开头 3. 不可 ...

  8. 在python中布尔类型的值包括_Python中布尔类型

    我们已经了解了Python支持布尔类型的数据,布尔类型只有True和False两种值,但是布尔类型有以下几种运算: 与运算:只有两个布尔值都为 True 时,计算结果才为 True. True and ...

  9. python中布尔类型是特殊的什么类型_Python中布尔类型

    标签: 我们已经了解了Python支持布尔类型的数据,布尔类型只有True和False两种值,但是布尔类型有以下几种运算: 与运算:只有两个布尔值都为 True 时,计算结果才为 True. True ...

最新文章

  1. 将文件名和文件修改时间批量输出至Excel中
  2. POJ 3070 Fibonacci
  3. 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决
  4. HTML meta标签总结与属性使用介绍
  5. “读书人”的事儿,能叫抄吗?
  6. python使用shell环境变量_linux中添加环境变量(python为例)
  7. vue从其它页面返回_vue页面按返回键等跳转重定向判断
  8. 解决Ubuntu17.04不能安装git的问题 E: Package 'git' has no installation candidate
  9. Windows 环境下 git 客户端中的 git-bash 和 MINGW64
  10. Linux debian设置主机不休眠教程
  11. linux日志区别,你要了解的linux系统日志知识点都在这
  12. TensorFlow model
  13. 对1,3,4,6,7,8组合显示成“1,3-4,6-8”方法
  14. angular js的元素指令
  15. CoppeliaSim(V-rep)手册中文翻译
  16. java开发接口文档_java之接口文档规范
  17. 区块链开发入门如何选择编程语言?
  18. input获取焦点vue_在Vue中输入框自动获取焦点的三种方式
  19. oppo禁用android系统通知栏,状态栏设置OPPO版
  20. table表格自动换行

热门文章

  1. Spring Security 实战干货:实现自定义退出登录
  2. 这个牛逼技术你可千万别学!
  3. 微服务2017年度报告出炉:4大客户画像,15%传统企业已领跑
  4. linux 查端口 三种,Linux查看端口常用的三种用例
  5. java win10 写入c盘_win10 1709 安装后很多软件没有权限向C盘写入文件
  6. 深度学习图像搜索与识别
  7. GoogLeNet(从Inception v1到v4的演进)
  8. android base64编码
  9. reid 数据集 行人重拾别
  10. Visual Studio 调试(Dubug)模式下的“未定义标识符”