简介
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有所帮助。
本文向大家介绍在程序的开发中,如何提高程序的运行效率?相关面试题,主要包含被问及在程序的开发中,如何提高程序的运行效率?时的应答技巧和注意事项,需要的朋友参考一下 (1)优化SQL语句,查询语句中尽量不使用select *,用哪个字段查哪个字段;少用子查询可用表连接代替;少用模糊查询。 (2)数据表中创建索引。 (3)对程序中经常用到的数据生成缓存(比如使用redis缓存数据,比如使用ob进行动态
本文向大家介绍如何利用FutureBuilder提高开发效率,包括了如何利用FutureBuilder提高开发效率的使用技巧和注意事项,需要的朋友参考一下 常见场景 展示请求按钮 用户点击按钮,显示loading 展示数据或者错误 抽象模式 展示请求按钮(初始状态) 用户点击按钮,显示loading(请求中状态) 展示数据或者错误 (结束状态(成功或失败)) 转换成程序语言 以上三种现实情况对应
我的理想过程将是: 卡拉夫在后台运行 部署我的所有包和依赖项(脚本) 让karaf监视我的maven local repo以查看我的包中的任何更改 打包并安装单个工件,然后让karaf重新加载它们 目前我使用karaf assembly进行生产,但这不允许我观看本地maven repo,因此每个构建周期都需要停止并组装完整的karaf发行版,然后再次运行它,这既慢又低效。 附注。这个过程可以使用G
本文向大家介绍六个窍门助你提高Python运行效率,包括了六个窍门助你提高Python运行效率的使用技巧和注意事项,需要的朋友参考一下 不喜欢Python的人经常会吐嘈Python运行太慢。但是,事实并非如此。尝试以下六个窍门,来为你的Python应用提速。 窍门一:关键代码使用外部功能包 Python简化了许多编程任务,但是对于一些时间敏感的任务,它的表现经常不尽人意。使用C/C++或机器语言的
本文向大家介绍Jetbrain IDE(PHPStom,Pycharm,Android Sudio,Idea...)高效开发远程程序,包括了Jetbrain IDE(PHPStom,Pycharm,Android Sudio,Idea...)高效开发远程程序的使用技巧和注意事项,需要的朋友参考一下 背景:公司1台配置比较弱的笔记本(8G内存)+1台性能良好的台式机(16G内存)。 原本笔记本除了安
本文向大家介绍微信小程序开发之toast等弹框提示使用教程,包括了微信小程序开发之toast等弹框提示使用教程的使用技巧和注意事项,需要的朋友参考一下 介绍 微信小程序中toast消息提示框只有两种显示的效果,就是成功和加载,使用wx.showToast(OBJECT) 。 看下有关参数说明: 代码很简单: mask属性好像并没有起作用。有一点值得注意的是提示的延迟时间是有限制的,最大10000毫