教你用Type Hint提高Python程序开发效率


Posted in Python onAugust 08, 2016

简介

Type Hint(或者叫做PEP-484)提供了一种针对Python程序的类型标注标准。

为什么使用Type Hint?对于动态语言而言,常常出现的情况是当你写了一段代码后,隔段时间你可能忘记这个方法的原型是什么样子的了,你也不清楚具体应该传入什么类型的参数,这样往往需要你去阅读代码才能定义每个类型具体是什么。或者当你使用一个文档并不是特别完全的第三方库,你不知道这个库应该如何使用,这都会很痛苦。

现在,借助Type Hint,你可以实现:

     1、实现类型检查,防止运行时出现的类型不符合情况。

     2、作为文档附加属性,方便开发者调用时传入传出的参数类型。

     3、提升IDE的检查机制,在智能提示时更快给出提示和类型检查结果。

实现这个过程中,你需要使用Python 3.5+中提供的新模块typing值得注意的是,这个改动并不会影响程序运行,仅仅是为了方便类型检查器实现的。

Type Hint类型检查器

目前,比如JetBrains家的PyCharm已经支持Type Hint语法检查功能,如果你使用了这个IDE,可以通过IDE功能进行实现。如果你像我一样,使用了SublimeText编辑器,那么第三方工具mypy可以帮助到你。AnacondaST3最近要发布的2.0版本也内置了mypy功能的支持,具体的进度可以看一下这个issue。一些其它的Python工具(比如代码提示工具jedi 0.10+)也支持了Type Hint功能。

从简单的例子开始

从简单的例子开始,我们先从一个简单的程序开始,运行环境为Python 3.5.2,使用mypy工具进行检查。

首先通过pip install mypy-lang命令安装mypy工具。注意是mypy-lang,之所以是这样,是因为在pypi里mypy这个名字已经被占用掉了。

接下来,通过mypy检查下面这个文件

# fib.py
from typing import Iterator


def fib(n: int) -> Iterator[int]:
  a, b = 0, 1
  while a < n:
    yield a
    a, b = b, a + b

i = fib(3.2)
print(next(i))
print(next(i))

在命令行中执行命令mypy fib.py,获取返回结果:

➜ mypy fib.py
fib.py:11: error: Argument 1 to "fib" has incompatible type "float"; expected "int"

但是在实际的应用过程中,这个功能在Python里是可以正常运行的:

➜ mypy python fib.py
0
1

可以看到,mypy工具提示了我们的代码中存在一处类型不匹配的问题,但是如果不进行检查,代码有可能执行出不可预知的结果。

在这个例子里面,我们使用了两种类型,一种是Python基础数据类型,比如str、int等等,这些类型数据是可以直接使用的;另外一种是来自于typing中引入的Iterator,用来表示迭代器类型。另外一个值得注意的是,typing中部分类型也会随时添加,一般我们以演示版本为准。

从简单到复杂,类型组合怎么办?

实际上,在我们使用过程中还有可能传递一些更加复杂的参数类型,比如list类型,tuple类型等等,这类型的数据如何声明呢?我们可以先看一个例子:

def foo(strings, string_list, count, total):

这个函数的参数我们从字面可以看出来分别是str,元素为str的list类型和两个整数参数。我们假定一个返回值为((int, int), str),那么这个类型检查可以这样定义:

from typing import List, Tuple

Result = Tuple[Tuple[int, int], str]

def foo(strings: str, lines: List[str], line_number: int, total_lines: int) -> Result:

其它的一些类型提示、协程等等的支持都可以在官方的typing模块文档中进行查看。

关于生产的一些闲扯

我们现在也在进行一些mypy工具在生产环境中的具体使用测试,但是我们也发现了一些存在的问题,比如Python本身的动态语言特性给类型标注就带来了一些麻烦。另外,变量复用导致的类型变换有可能会提示采用新的变量实现。这对于一个已经存在的线上项目来说相对成本较高,我们后续也会在一些新项目中采用这种方式。另外mypy还是一个比较新的项目,本身是拥有一些bug。另外一个是在某些mypy的非类型错误提示其实非常的模糊,导致很多错误有时需要进行人工排查。

不管怎样,即便在mypy存在一些缺陷,但是仍旧是未来非常有潜力的工具,提前了解和应用也能有效的提升程序的强壮性。以上就是利用Type Hint提升Python程序开发效率的全部内容,希望本文对大家使用python有所帮助。

Python 相关文章推荐
python基础教程之python消息摘要算法使用示例
Feb 10 Python
Python中使用装饰器时需要注意的一些问题
May 11 Python
Python中enumerate()函数编写更Pythonic的循环
Mar 06 Python
pandas读取csv文件,分隔符参数sep的实例
Dec 12 Python
python中的colorlog库使用详解
Jul 05 Python
Django为窗体加上防机器人的验证码功能过程解析
Aug 14 Python
Python中 Global和Nonlocal的用法详解
Jan 20 Python
python操作docx写入内容,并控制文本的字体颜色
Feb 13 Python
django 实现后台从富文本提取纯文本
Jul 02 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
Jan 01 Python
Python如何使用循环结构和分支结构
Apr 13 Python
Python实现Matplotlib,Seaborn动态数据图
May 06 Python
Python如何实现文本转语音
Aug 08 #Python
Python脚本处理空格的方法
Aug 08 #Python
基于Python实现对PDF文件的OCR识别
Aug 05 #Python
利用Python实现命令行版的火车票查看器
Aug 05 #Python
Python处理JSON数据并生成条形图
Aug 05 #Python
用Python解决计数原理问题的方法
Aug 04 #Python
快速入手Python字符编码
Aug 03 #Python
You might like
php adodb连接不同数据库
2009/03/19 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
2013/08/09 PHP
php从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
浅谈PHP进程管理
2019/03/08 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
javascript 数据类型转换(parseInt,parseFloat)
2010/07/20 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
ajax java 实现自动完成功能
2012/12/19 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
2015/06/25 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
2016/06/08 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
浅谈vue中.vue文件解析流程
2018/04/24 Javascript
100行代码实现一个vue分页组功能
2018/11/06 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
2020/05/18 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
python基础教程之自定义函数介绍
2014/08/29 Python
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
python实现可变变量名方法详解
2019/07/01 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
python 获取当前目录下的文件目录和文件名实例代码详解
2020/03/10 Python
keras 模型参数,模型保存,中间结果输出操作
2020/07/06 Python
CSS3绘制圆角矩形的简单示例
2015/09/28 HTML / CSS
Canvas实现保存图片到本地的示例代码
2018/06/28 HTML / CSS
俄罗斯小米家用电器、电子产品和智能家居商店:Poood.ru
2020/04/03 全球购物
如果Session Bean得Remove方法一直都不被调用会怎么样
2012/07/14 面试题
Servlet的生命周期
2013/08/25 面试题
交通安全寄语大全
2014/04/08 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
幼儿园见习报告
2014/10/30 职场文书
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis