记得在几年前,那时候我还不怎么使用 vscode 编写 python,由于项目大多是数据处理相关,因此更多使用 jupyter notebook 。那写代码的体验感,用 "磕磕绊绊" 形容就再适合不过。
那时候我还填过两次关于在 vscode 编写 python 的体验调研问卷,最后我回复"希望 python 能与 typescript 一样,可以玩类型体操"。
随着前几年 python 作者重新复出并进入微软工作,真的感觉 python 的类型标注越来越靠近 typescript 了(typescript 是微软研发的前端语言)。
几年后的今天,我已经离不开 vscode 了,因为现在写代码是这样子:
今天,我们就盘点一些常见好用的类型标注使用方式。
今天介绍的许多标注类型可能不兼容 python 3.8 以下,但是官方特别制作了一个 typing_extensions
库
pip install typing_extensions
vscode 需要安装插件 Pylance
不要忘记一键三连。你的点赞、收藏、关注,是我创作的动力。
先看看最普通的类型标注使用方式。
使用 pandas 的分组 apply
函数时,你可以传入一个自定义函数,其中第一个参数是该组的 DataFrame
,如果没有类型标注,函数中就无法得到智能提示:
体验有点糟糕,因此我很喜欢为函数的参数标注类型:
仅仅在参数后面添加 :pd.DataFrame
即可
有时候我们自定义函数,希望参数是指定范围内的文本。比如考虑到 pandas 的排序函数:
现在我们自定义一个排序函数,希望可以让定义更加直观:
使用字典定义排序再适合不过,但是,升降序的字符串很容易填错。关键在于字典的第二个类型指定:
自定义一个限定类型即可:
前面的参数类型标注只是开胃菜,在 python 中存在一种动态参数,可以说是类型标注的一大"拦路虎"。
下面是一个实现批量合并目录中所有 excel 文件数据的函数:
传入文件夹路径,自动遍历 excel 文件合并。但是,pandas 读取 excel 文件的函数还有许多其他的参数,用于控制加载时的行为:
怎么办?如果把参数一个个挪到自定义函数里面:
好吧,行7,8定义参数,这无可厚非,问题在于行11-14,需要重新再次重复定义参数,以便传入行18的 read_excel
函数中。
python 不仅可以在调用函数时解包参数,还可以在定义函数时收集参数:
完美了吗?并没有,因为此时完全没有智能提示:
谁知道后面的参数名字是啥呀!
看看怎么解决,正如之前所说,定义每个参数是无可避免了:
typing
模块中导入 TypedDict
TypedDict
,把需要的参数定义成类变量TypedDict
是 python 3.8 新加入,如果你希望在以前的 python 版本使用,可以按照使用 typing_extensions
接着,还需要导入 Unpack
类型,结合使用即可:
现在使用函数的时候,就能明确提示缺少了什么参数:
这仍然有问题,这些参数应该都是可选才行。所以就需要另一个类型标注:
现在就已经有足够的智能提示:
如果我们定义一个 key 值全是常量的字典,现在 vscode 已经可以自动标注类型
它会给出可选项:
[
的时候,就会出现下拉框,并且补全 ]
,敲 tab
键选择即可但是,如果是从一个函数或另一个模块返回的字典,这种提示则不会生效:
按照官方的说法,由于函数返回时可能会动态修改字典,因此目前是不支持。
对我来说,它仍然有一些使用场景。
有时候我们会在最上方定义一些全局的常量,方便维护修改,以前我是这样写:
这种方式如果配置非常多,不太方便管理,简单情况下就可以使用字典:
缺点是,你无法使用 f2 重命名符号批量修改 key 值