Python中类型检查的详细介绍


Posted in Python onFebruary 13, 2017

前言

大家都知道Python 是一门强类型、动态类型检查的语言。所谓动态类型,是指在定义变量时,我们无需指定变量的类型,Python 解释器会在运行时自动检查。

与静态类型语言(如 C 语言)相比,这不仅仅是少写了几个类型声明字符:

#include <stdlib.h>
#include <stdio.h>

#define BUFF 100

char* greeting(char* name){ 
 char* msg = (char *) malloc(sizeof(char) * BUFF);
 sprintf(msg, "Hello, %s!", name);
 return msg;
}

int main(){ 
 printf("Greeting: <%s>\n", greeting("C99"));
 return 0;
}
def greeting(name): 
 return "Hello, {}!".format(name)
def main(): 
 print("Greeting: <%s>" % greeting("Python35"))
if __name__ == '__main__': 
 main()

动态类型从一定程度上将我们的思维从对计算机的工作模拟中解放出来,可以将更多精力集中在需要解决的问题上:就像上面的例子,我们不需要费心思考虑greeting函数所接受的参数是什么类型、返回值是什么类型,而只需要考虑greeting函数需要实现的功能即可。

当然并不是说动态类型一定优于静态类型,上面的例子用 C 语言和 Python 相比也有失公允,如果换成 Go 语言:

package main

import "fmt"

func greeting(name string) string { 
 return fmt.Sprintf("Hello, %s", name)
}
func main() { 
 fmt.Printf("Greeting: <%s>", greeting("Go"))
}

静态类型的优势(从某种程度上说也是缺点)在于定义方法时制定一种强制性的协议(接口),只有遵循协议才能正确地使用。这对多人合作、开发第三方库、快速定位 BUG 等是很有帮助的。静态类型还有一大优势是可以让 IDE 帮助提示接口用法和类型检查,进一步提高效率。既然有这么多优势,那 Python 要不要也学习一个?实际上 Python 3.5 中的 PEP 484 和 Python 3.6 的PEP 526 分别加入了类型提示(Type Hints)的语法,其中 PEP 484 主要关于函数、方法、类的参数和返回值的类型声明语法,而 PEP 526添加了对变量类型的声明:

def greeting(name: str) -> str: 
 return "Hello, {}!".format(name)

Mypy

Mypy 是官方推荐一个静态类型检查工具:

python3 -m pip install mypy

可以用 mypy 命令直接检查 Python 程序:

mypy greeting.py

为了方便使用,可以将其应用到 IDE 中,以 Atom 为例,可以安装插件linter-mypy:

python3 -m pip install typed-ast 
apm install linter 
apm install linter-mypy

Python中类型检查的详细介绍

Mypy 支持的常用类型如下表所示(来自官方文档):

Python中类型检查的详细介绍

其中List/Dict/Iterable/Sequence/Any来自标准库 typing。这里的 Sequence和Iterable分别对应collections.abc.Sequencecollections.abc.Iterable,简单来区分Sequence是可以通过数字下标索引的,而Iterable可以代表生成器:

Python中类型检查的详细介绍

Python 2.x

添加了类型注释的代码可以直接通过 Python 3.5 解释器执行,但是对于 Python 2.x 则是完全不兼容的。如果要在 Python 2.x 中使用,首先需要安装 typing:

pip install typing

然后可以用单行注释的形式强行添加:

def send_email(address, # type: Union[str, List[str]] 
  sender, # type: str
  cc,  # type: Optional[List[str]]
  bcc,  # type: Optional[List[str]]
  subject='',
  body=None # type: List[str]
  ):
 # type: (...) -> bool
 """Send an email message. Return True if successful."""
 pass

总结

Python 3.5+ 从语法上支持静态类型提示,在不影响正常使用习惯的情况下为我们提供静态类型检查的功能,虽说不能与真正的静态类型语言相比,但也保证了更大的灵活性,这也符合 Python 的一贯的设计思想:“It's a tool, not a rule.”好了,以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
使用基于Python的Tornado框架的HTTP客户端的教程
Apr 24 Python
Django框架中render_to_response()函数的使用方法
Jul 16 Python
python僵尸进程产生的原因
Jul 21 Python
用Python实现数据的透视表的方法
Nov 16 Python
python opencv读mp4视频的实例
Dec 07 Python
对Python3.x版本print函数左右对齐详解
Dec 22 Python
Python里字典的基本用法(包括嵌套字典)
Feb 27 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
Oct 30 Python
python3将变量写入SQL语句的实现方式
Mar 02 Python
将tf.batch_matmul替换成tf.matmul的实现
Jun 18 Python
python实现文件+参数发送request的实例代码
Jan 05 Python
python中pd.cut()与pd.qcut()的对比及示例
Jun 16 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
Feb 13 #Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 #Python
python数据清洗系列之字符串处理详解
Feb 12 #Python
python中numpy基础学习及进行数组和矢量计算
Feb 12 #Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 #Python
python3制作捧腹网段子页爬虫
Feb 12 #Python
python日志记录模块实例及改进
Feb 12 #Python
You might like
PHP队列用法实例
2014/11/05 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
PHP实现批量修改文件后缀名的方法
2015/07/30 PHP
PHP Trait代码复用类与多继承实现方法详解
2019/06/17 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
通过身份证号得到出生日期和性别的js代码
2009/11/23 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
基于Jquery+div+css实现弹出登录窗口(代码超简单)
2015/10/27 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
使用D3.js构建实时图形的示例代码
2018/08/28 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
2020/08/06 Javascript
介绍Python的Django框架中的静态资源管理器django-pipeline
2015/04/25 Python
关于python的list相关知识(推荐)
2017/08/30 Python
Python基于opencv的图像压缩算法实例分析
2018/05/03 Python
PyCharm代码整体缩进,反向缩进的方法
2018/06/25 Python
如何在python字符串中输入纯粹的{}
2018/08/22 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
详解Python的三种可变参数
2019/05/08 Python
如何用Python制作微信好友个性签名词云图
2019/06/28 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
Python中的self用法详解
2019/08/06 Python
Django在Model保存前记录日志实例
2020/05/14 Python
Django返回HTML文件的实现方法
2020/09/17 Python
ASP.NET中的身份验证有那些
2012/07/13 面试题
文明餐桌活动方案
2014/02/11 职场文书
大专学生求职信
2014/07/04 职场文书
2016年中秋祝酒词
2015/11/26 职场文书
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python
python pygame 开发五子棋双人对弈
2022/05/02 Python