教你用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设置默认编码为utf8的方法
Jul 01 Python
Python编程实现的简单Web服务器示例
Jun 22 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
Dec 19 Python
一篇文章读懂Python赋值与拷贝
Apr 19 Python
python代码打印100-999之间的回文数示例
Nov 24 Python
Python文件操作函数用法实例详解
Dec 24 Python
python numpy数组复制使用实例解析
Jan 10 Python
python实现录屏功能(亲测好用)
Mar 02 Python
vue常用指令代码实例总结
Mar 16 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 Python
Python 操作 MySQL数据库
Sep 18 Python
在python3.9下如何安装scrapy的方法
Feb 03 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抓取https的内容的代码
2010/04/06 PHP
PHP中的float类型使用说明
2010/07/27 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
PHP中的随机性 你觉得自己幸运吗?
2016/01/22 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
PHP之多条件混合筛选功能的实现方法
2019/10/09 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
css图片自适应大小
2007/11/28 Javascript
javascript编码的几个方法详细介绍
2013/01/06 Javascript
jquery自动将form表单封装成json的具体实现
2014/03/17 Javascript
jQuery简单实现禁用右键菜单
2015/03/10 Javascript
jQuery计算文本框字数及限制文本框字数的方法
2016/03/01 Javascript
详解JavaScript跨域总结与解决办法
2016/10/31 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
Ajax和Comet技术总结
2017/02/19 Javascript
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
2019/06/28 Javascript
判断JavaScript中的两个变量是否相等的操作符
2019/12/21 Javascript
Python获取邮件地址的方法
2015/07/10 Python
Python脚本实现自动发带图的微博
2016/04/27 Python
浅谈对yield的初步理解
2017/05/29 Python
Python创建或生成列表的操作方法
2019/06/19 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
2020/05/28 Python
CSS3实现的渐变幻灯片效果
2020/12/07 HTML / CSS
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
《九寨沟》教学反思
2014/04/08 职场文书
党的群众路线教育实践活动剖析材料
2014/09/30 职场文书
工作检讨书500字
2014/10/19 职场文书
2015年个人自我剖析材料
2014/12/29 职场文书
教您:房贷工资收入证明应该怎么写?
2019/08/19 职场文书
基于angular实现树形二级表格
2021/10/16 Javascript
nginx搭建NFS网络文件系统
2022/04/14 Servers