Python标准库--typing
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明。谢谢!
1 模块简介
Python 3.5 增加了一个有意思的库--typing。这将会给Python增加了类型暗示。类型暗示是一种可以将你的函数变量声明为一种特定类型的声明。当然,类型暗示并不是绑定。它仅仅是暗示,所以这种机制并不能阻止工程师传入他们不应该传入的参数。这个就是Python。你可以在PEP 484中阅读类型暗示的说明,或者你也可以在PEP 483 阅读背后的理论。
2 模块使用
2.1 基本使用
下面让我们看一个简单的例子,
>>> def some_function(number:int,name:str) -> None:
... print("%s entered %s"%(name,number))
>>> some_function(13,"Mike")
Mike entered 13
这就意味着some_function函数认为两个变量中第一个变量是整数,第二个变量是字符串。你或许可能已经注意到,我们已经暗示这个函数将会返回None。
请允许我们倒退一下,先写一个普通的函数。然后我们将会添加类型暗示。在下面这个例子中,我们写了一个函数,这个函数的入参是一个列表和一个变量name,name的类型是字符串。这个函数的功能就是检查变量name是否在这个列表中,然后返回一个适当的布尔值。
def process_data(my_list,name):
if name in my_list:
return True
else:
return False
if __name__ == "__main__":
my_list = ["Mike","Nick","Toby"]
print(process_data(my_list,"Mike"))
print(process_data(my_list,"John"))
下面我们为这个函数添加类型暗示。
def process_data(my_list:list,name:str) -> bool:
return name in my_list
if __name__ == "__main__":
my_list = ["Mike","Nick","Toby"]
print(process_data(my_list,"Mike"))
print(process_data(my_list,"John"))
在这段代码中,我们暗示第一个变量是列表类型,第二个变量是字符串类型,返回值是布尔类型。
根据PEP 484 ,“类型暗示可能会是内置的类(包括定义在标准库或者第三方扩展库),抽象出的基类,types模块中可获得类型和用户定义的类”。这就意味着我们可以创建我们自己的类,然后添加一个暗示。
class Fruit:
def __init__(self,name,color):
self.name = name
self.color = color
def salad(fruit_one:Fruit,fruit_two:Fruit) -> list:
print (fruit_one.name)
print (fruit_two.name)
return [fruit_one,fruit_two]
if __name__ == "__main__":
f = Fruit("orange","orange")
f2 = Fruit("apple","red")
salad(f,f2)
在这段代码中,我们首先创建一个类Fruit,然后定一个函数,将两个入参暗示为类Fruit的实例并返回一个列表对象。另一个我认为有意思的话题就是你可以创建一个别名。下面是一个超级简单的例子。
import string
Animal = string
def zoo(animal:Animal,number:int) -> None:
print("The zoo has %s %s" % (number,animal))
if __name__ == "__main__":
zoo("Zebras",10)
你可以能已经猜到,我们就是将变量Animal作为string类型的别名。然后我们使用别名Animal向我们的函数添加一个暗示。
2.2 类型暗示与重载函数
在你的代码中,我认为类型暗示可以在重载函数这块做的很好。我们已经在 functools 模块中学习了函数重载。我们以这部分中的相加函数为例,看看利用类型暗示如何做的更好。下面是原始的代码,
import string
from functools import singledispatch
@singledispatch
def add(a,b):
raise NotImplementedError("Unsupport type")
@add.register(int)
def _(a,b):
print("Fist argument is of type ",type(a))
print (a+b)
@add.register(string)
def _(a,b):
print("Fist argument is of type ",type(a))
print (a+b)
@add.register(list)
def _(a,b):
print("Fist argument is of type ",type(a))
print (a+b)
在这个例子中,如果你理解Python的函数重载是如何工作的,函数的第一个变量的意义就很明显了。但是我们并不知道第二个变量应该是什么。我们可以推测,但是在Python中它最好是明确的而非隐含的。所以我们需要添加一些类型暗示。
import string
from functools import singledispatch
@singledispatch
def add(a,b):
raise NotImplementedError("Unsupport type")
@add.register(int)
def _(a:int,b:int) -> int:
print("Fist argument is of type ",type(a))
print (a+b)
return a+b
@add.register(string)
def _(a:string,b:string) -> string:
print("Fist argument is of type ",type(a))
print (a+b)
return a+b
@add.register(list)
def _(a:list,b:list) -> list:
print("Fist argument is of type ",type(a))
print (a+b)
return a+b
现在我们已经添加了一些类型暗示,我们仅仅通过观察函数的定义就可以知道变量应该是什么类型。在类型暗示添加之前,你需要在函数的docstring中说明变量类型,由于我们已经有了类型暗示,我们就不再需要添加docstring等信息。
我在一些Python代码中已经很少添加文档了,即使函数和方法定义中仅仅有类型暗示,依然可以更容易的理解。类型暗示并不能替代一个好的说明文档,但是通过使用它,在后续开发过程中可以让我们更容易地理解我们的代码。
2.2 总结
当我第一次听说类型暗示,我就被它迷住。它的概念很简洁,我可以很明确地使用它。第一个使用场景就是可以作为你的代码的自文档。我看过很多代码,它们很难告诉你一个函数或者类的接收参数类型,虽然类型暗示并不会强制任何事,它却会让这些有歧义的代码更加清晰。如果一些Python IDE添加了一个可选的标志位,这将会检查你的代码的类型暗示,最终会确保你可以正确调用你的代码。
我非常乐意推荐阅读Python的 官方文档,那里有很多信息。PEP规范也包含了很多细节。
3 Reference
Python标准库--typing的更多相关文章
- 转--Python标准库之一句话概括
作者原文链接 想掌握Python标准库,读它的官方文档很重要.本文并非此文档的复制版,而是对每一个库的一句话概括以及它的主要函数,由此用什么库心里就会有数了. 文本处理 string: 提供了字符集: ...
- Python 标准库一览(Python进阶学习)
转自:http://blog.csdn.net/jurbo/article/details/52334345 写这个的起因是,还是因为在做Python challenge的时候,有的时候想解决问题,连 ...
- Python标准库14 数据库 (sqlite3)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.S ...
- python标准库00 学习准备
Python标准库----走马观花 python有一套很有用的标准库.标准库会随着python解释器一起安装在你的电脑上的.它是python的一个组成部分.这些标准库是python为你准备的利器,可以 ...
- Python标准库:内置函数hasattr(object, name)
Python标准库:内置函数hasattr(object, name) 本函数是用来判断对象object的属性(name表示)是否存在.如果属性(name表示)存在,则返回True,否则返回False ...
- python标准库xml.etree.ElementTree的bug
使用python生成或者解析xml的方法用的最多的可能就数python标准库xml.etree.ElementTree和lxml了,在某些环境下使用xml.etree.ElementTree更方便一些 ...
- 【python】Python标准库defaultdict模块
来源:http://www.ynpxrz.com/n1031711c2023.aspx Python标准库中collections对集合类型的数据结构进行了很多拓展操作,这些操作在我们使用集合的时候会 ...
- Python标准库
Python标准库是随Python附带安装的,它包含大量极其有用的模块.熟悉Python标准库是十分重要的,因为如果你熟悉这些库中的模块,那么你的大多数问题都可以简单快捷地使用它们来解决. sys模块 ...
- Python标准库07 信号 (signal包,部分os包)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习 ...
随机推荐
- JS核心系列:浅谈 call apply 与 bind
在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...
- PHP-解析验证码类--学习笔记
1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1 定义变量 //随机因子 private $char ...
- 【翻译】Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么?
0.前言 虽然很早就知道R被微软收购,也很早知道R在统计分析处理方面很强大,开始一直没有行动过...直到 直到12月初在微软技术大会,看到我软的工程师演示R的使用,我就震惊了,然后最近在网上到处了解和 ...
- 深入node之Transform
Transform流特性 在开发中直接接触Transform流的情况不是很多,往往是使用相对成熟的模块或者封装的API来完成流的处理,最为特殊的莫过于through2模块和gulp流操作.那么,Tra ...
- [BootStrap] 富编辑器,基于wysihtml5
在我的周围,已经有很多人在使用BootStrap,但对于任何一个带留言.评论.提问.文章编辑功的网站,编辑器永远是重中之重,显然,早期的编辑器完全没考虑过BootStrap的出现,或皮肤跟网站不匹配, ...
- 移动应用App测试与质量管理一
测试工程师 基于Html的WebApp测试, 现在一些移动App混Html5 HTML5性能测试 兼容性 整理后的脑图 测试招聘 弱化大量技术考察 看重看问题的高度 看重潜力 测试经验 质量管理 专项 ...
- Linux实战教学笔记06:Linux系统基础优化
第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...
- Spring Quartz实现任务调度
任务调度 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作 任务调度涉及多线程并发.线程池维 ...
- 面向未来的友好设计:Future Friendly
一年前翻译了本文的一部分,最近终于翻译完成.虽然此设计思想的提出已经好几年了,但是还是觉得应该在国内推广一下,让大家知道“内容策略”,“移动优先”,“响应式设计”,“原子设计”等设计思想和技术的根源. ...
- opengl 笔记(1)
参考<opengl入门教程>.<OpenGL之坐标转换>.<OpenGL绘制管线操作细节>等资料. 复习下留个备忘:) /*- * Opengl Demo Test ...