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

简介

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有所帮助。

(0)

相关推荐

  • Python利用IPython提高开发效率

    一.IPython 简介 IPython 是一个交互式的 Python 解释器,而且它更加高效. 它和大多传统工作模式(编辑 -> 编译 -> 运行)不同的是, 它采用的工作模式是:执行 -> 探索 ,而大部分和数据分析相关的代 码都含有探索式操作(比如试误法和迭代法),所以 IPython 能大大提高编码效率. IPython 发展到现在,它不仅仅只是一个加强版的 Python shell 了, 它集成了 GUI 控制台,这可以让你直接进行绘图操作:它还有一个基于 Web 的交互式笔记

  • Python while、for、生成器、列表推导等语句的执行效率测试

    一个功能的实现,可以用多种语句来实现,比如说:while语句.for语句.生成器.列表推导.内置函数等实现,然而他们的效率并不一样.写了一个小程序来测试它们执行的效率. 测试内容: 将一个数字大小为20万的数字,依次取绝对值,放到列表中,测试重复1千次. 测试程序: 复制代码 代码如下: import time,sys  reps = 1000                #测试重复次数  nums = 200000              #测试时数字大小      def tester(

  • 盘点提高 Python 代码效率的方法

    第一招:蛇打七寸:定位瓶颈 首先,第一步是定位瓶颈.举个简单的栗子,一个函数可以从1秒优化到到0.9秒,另一个函数可以从1分钟优化到30秒,如果要花的代价相同,而且时间限制只能搞定一个,搞哪个?根据短板原理,当然选第二个啦. 一个有经验的程序员在这里一定会迟疑一下,等等?函数?这么说,还要考虑调用次数?如果第一个函数在整个程序中需要被调用100000次,第二个函数在整个程序中被调用1次,这个就不一定了.举这个栗子,是想说明,程序的瓶颈有的时候不一定一眼能看出来.还是上面那个选择,程序员的你应该有

  • 分享Python开发中要注意的十个小贴士

    大家请注意:这篇文中假设我们都用的是Python 3 1. 列表推导式 你有一个list:bag = [1, 2, 3, 4, 5] 现在你想让所有元素翻倍,让它看起来是这个样子: [2, 4, 6, 8, 10] 大多初学者,根据之前语言的经验会大概这样来做 bag = [1, 2, 3, 4, 5] for i in range(len(bag)): bag[i] = bag[i] * 2 但是有更好的方法: bag = [elem * 2 for elem in bag] 很简洁对不对?这

  • 六个窍门助你提高Python运行效率

    不喜欢Python的人经常会吐嘈Python运行太慢.但是,事实并非如此.尝试以下六个窍门,来为你的Python应用提速. 窍门一:关键代码使用外部功能包 Python简化了许多编程任务,但是对于一些时间敏感的任务,它的表现经常不尽人意.使用C/C++或机器语言的外部功能包处理时间敏感任务,可以有效提高应用的运行效率.这些功能包往往依附于特定的平台,因此你要根据自己所用的平台选择合适的功能包.简而言之,这个窍门要你牺牲应用的可移植性以换取只有通过对底层主机的直接编程才能获得的运行效率.以下是一些

  • Python中map和列表推导效率比较实例分析

    本文实例讲述了Python中map和列表推导效率比较.分享给大家供大家参考.具体分析如下: 直接来测试代码吧: #!/usr/bin/env python # -*- coding: utf-8 -*- # list comprehension and map import time def test(f, name): st = time.time() f() print '%s %ss'%(name, time.time()-st) TIMES = 1000 ARR = range(1000

  • 在Python3中初学者应会的一些基本的提升效率的小技巧

    有时候我反问我自己,怎么不知道在Python 3中用更简单的方式做"这样"的事,当我寻求答案时,随着时间的推移,我当然发现更简洁.有效并且bug更少的代码.总的来说(不仅仅是这篇文章),"那些"事情总共数量是超过我想象的,但这里是第一批不明显的特性,后来我寻求到了更有效的/简单的/可维护的代码. 字典 字典中的keys()和items() 你能在字典的keys和items中做很多有意思的操作,它们类似于集合(set): aa = {'mike': 'male', '

  • 几个提升Python运行效率的方法之间的对比

    在我看来,python社区分为了三个流派,分别是python 2.x组织,3.x组织和PyPy组织.这个分类基本上可以归根于类库的兼容性和速度.这篇文章将聚焦于一些通用代码的优化技巧以及编译成C后性能的显著提升,当然我也会给出三大主要python流派运行时间.我的目的不是为了证明一个比另一个强,只是为了让你知道如何在不同的环境下使用这些具体例子作比较. 使用生成器 一个普遍被忽略的内存优化是生成器的使用.生成器让我们创建一个函数一次只返回一条记录,而不是一次返回所有的记录,如果你正在使用pyth

  • Python 多线程抓取图片效率对比

    目的: 是学习python 多线程的工作原理,及通过抓取400张图片这种IO密集型应用来查看多线程效率对比 import requests import urlparse import os import time import threading import Queue path = '/home/lidongwei/scrapy/owan_img_urls.txt' #path = '/home/lidongwei/scrapy/cc.txt' fetch_img_save_path =

  • 提升Python程序运行效率的6个方法

    Python是一个很酷的语言,因为你可以在很短的时间内利用很少的代码做很多事情.不仅如此,它还能轻松地支持多任务,比如多进程等.Python批评者有时会说Python执行缓慢.本文将尝试介绍6个技巧,可加速你的Python应用程序. 1.让关键代码依赖于外部包 虽然Python让许多编程任务变得容易,但它可能并不总能为紧急的任务提供最佳性能.你可以为紧急的任务使用C.C++或机器语言编写的外部包,这样可以提高应用程序的性能.这些包都是不能跨平台的,这意味着你需要根据你正在使用的平台,寻找合适的包

随机推荐