尽管pyhton从3.5版本开始就引入了类型系统股票配资门户有哪些,但到目前为止,接受程度不是特别的高,很多的开源库仍然没有使用类型标注。
究其原因,我认为最主要的一条是类型标注不是必须的,且python解释器并不检查你所做的类型标注,那么大家在代码里添加类型标注的动力也就不大。
一项好的技术,没有被推广,单纯的说它不是必须的,不能解释所有的问题,另一个影响类型标注广泛使用的原因,我认为是类型标注有一点难度,官方文档没有尽全力为大家解释该如何使用。这使得很多想要使用类型标注的人望而却步,毕竟,即便费力的做了,也没有很明显很直观的收益。
本文将通过实际的例子为你展示如何在python代码里做类型标注。
1. 为变量做类型标注
我们先来通过最简单的情况,为变量做类型标注,变量可以有如下类型:
int
float
bool
str
展开剩余85%bytes
None
list
tuple
set
dict
1.1 简单的数据类型
int, float, bool, str, None,bytes 这些都是最简单的数据类型,他们的类型标注也是最简单的,创建脚本typehint.py
使用mypy对类型标注进行检查
检查结果
这说明我们对这4种变量的类型标注是正确的,但上面的代码存在严重的缺陷,变量d我为它标注为None,那么d这个变量就永远只能为None了,如果我将其赋值为其他类型,类型标注检查就会报错, 修改代码
使用mypy检查结果
修改后的代码可以正常执行,因为python解释器才不管类型标注呢,但是将5赋值给d就不符合类型标注的要求了。
类型标注的意义是标注一个变量的数据类型,此后的代码都应当遵守对这个变量的类型标注,这就要求我们,不能随意的修改变量的数据类型。
1.2 使用 Optional
在1.1 的例子中,d变量别标注为None类型,可一个变量始终赋值为None是毫无意义的事情,你只是在最初的时候不想给它一个明确的值才赋值为None的,后面的代码一定会修改变量d的值的。
假设你对变量d的使用是希望为它赋值一个int类型的数据,那么在类型标注的时候,就应当做好准备
Optional表示可选,那么d就可以被赋值成int类型,此外也可以是None。
1.3 使用Union
d 能赋值成int,也可能被赋值成float, 这种情况,要结合Optional 和 Union
Union表示或的意思,d变量的类型,可以是None,也可以是int或者float。
接下来,你可能会问,可不可以将a变量的类型标注设置为Union[int, float], 让a以赋值成int也可以赋值成为float? 从纯粹的技术实现上讲这样做没有问题
但从工程实践的角度来看,这种做法简直就是脱裤子放屁,多此一举。我们为变量进行类型标注的目的就是为了防止变量在使用过程中由于缺乏类型检查导致类型变来变去,你这样不就是又回到了之前的状态了么,那做类型标注还有什么意义呢,还不如不做。
d变量与其他几个变量不同,d变量初始值赋值为None,我们心里很清楚,它的值一定会被改变的,不然留着它毫无意义, 而一旦改变,就必然导致数据类型发生变化,因此才需要我们使用Optional。其他变量呢,值改变了,数据类型可以不发生变化,如果类型发生了变化,说明你的操作就违背了类型标注的初衷。
1.4 为容器类型做标注
list, tuple, dict, set, 为这4个容器类型数据做标注,要稍微麻烦一点点, 先来看最简单的set,
1.4.1 为集合做标注
在使用set时,我们默认只会向集合中添加相同数据类型的值,但你要明确一点,集合可以存储不同类型的数据。
这段代码可以通过mypy的检查, 接下来看列表如何做标注
1.4.2 为列表做标注
列表标注的方式与集合是一样的,但我们都清楚,列表里存储的数据往往都是类型不相同的,比如下面的列表
对这种情况,就需要使用1.3小节所介绍的Union
1.4.3 为元组做标注
为元组做标注,不能使用和列表相同的办法,而是要逐个索引位置进行标注
1.4.4 为字典做标注
先来看最简单的,字典的key都是字符串,value都是int
这是最理想的情况,但实际情况往往更复杂,字典的key可以有str类型,也可以有int类型,当类型不确定的时候,我们就可以使用Union
还有更复杂的情况
字典里的value,可以是元组,也可以是字典,字典嵌套了字典,在做类型标注的时候,也就需要以嵌套的形式进行标注。对于这种复杂的字典,我的建议就是简化处理
value可以是元组,也可以是字典,我只要标注到这个程度就可以了,不再继续详细的进行标注,不然单单一个类型标注就把代码搞的难以理解了。
1.4.5 容器类型标注总结
容器类型标注,可以粗略的进行标注,也可以详细的进行标注,这完全取决于你的想法,我的观点是,在不影响代码可阅读性的前提下详细标注,反之则粗略标注
2. 为函数做标注类型
2.1 对形参和返回值进行标注
为函数做标注类型,需要对每一个形参做类型标注,同时还要对函数的返回值做类型标注
形参的变量类型,我们事先是清楚的,因此你只需要按照第一节里的讲解对形参进行标注就可以了,函数的返回值在函数定义时进行标注,在有括号后面紧跟着进行标注,注意需要用到“->”。
如果返回值的类型可能是int,也可能是None,该怎么标注呢?其实这种情况完全可以参考对变量的标注
看到这里你应该明白,对函数参数及返回值的标注,完全遵守对变量的标注规则,唯一需要区别对待的是函数的返回值。
2.2 对可变参数进行标注
python的可变参数一个是*args, 一个是**kwargs,从函数的视角来看,args的类型是元组,kwargs的类型是字典,先来看args
我很确定args里的元素都是int类型,那么直接标注为int就可以了,如果还有其他类型,那么就需要使用Union
发布于:湖南省顶益所配资提示:文章来自网络,不代表本站观点。