前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >?自从python作者到了微软工作后,python的类型提示越来越多花活了

?自从python作者到了微软工作后,python的类型提示越来越多花活了

作者头像
咋咋
发布2023-12-12 21:27:17
1270
发布2023-12-12 21:27:17
举报
文章被收录于专栏:数据大宇宙数据大宇宙

记得在几年前,那时候我还不怎么使用 vscode 编写 python,由于项目大多是数据处理相关,因此更多使用 jupyter notebook 。那写代码的体验感,用 "磕磕绊绊" 形容就再适合不过。

那时候我还填过两次关于在 vscode 编写 python 的体验调研问卷,最后我回复"希望 python 能与 typescript 一样,可以玩类型体操"。

随着前几年 python 作者重新复出并进入微软工作,真的感觉 python 的类型标注越来越靠近 typescript 了(typescript 是微软研发的前端语言)。

几年后的今天,我已经离不开 vscode 了,因为现在写代码是这样子:

今天,我们就盘点一些常见好用的类型标注使用方式。

今天介绍的许多标注类型可能不兼容 python 3.8 以下,但是官方特别制作了一个 typing_extensions

代码语言:javascript
复制
pip install typing_extensions

vscode 需要安装插件 Pylance

不要忘记一键三连。你的点赞、收藏、关注,是我创作的动力。


回调函数的参数

先看看最普通的类型标注使用方式。

使用 pandas 的分组 apply 函数时,你可以传入一个自定义函数,其中第一个参数是该组的 DataFrame ,如果没有类型标注,函数中就无法得到智能提示:

体验有点糟糕,因此我很喜欢为函数的参数标注类型:

仅仅在参数后面添加 :pd.DataFrame 即可


限定文本

有时候我们自定义函数,希望参数是指定范围内的文本。比如考虑到 pandas 的排序函数:

  • 行13:列名和是否升序分开来定义,不友好

现在我们自定义一个排序函数,希望可以让定义更加直观:

使用字典定义排序再适合不过,但是,升降序的字符串很容易填错。关键在于字典的第二个类型指定:

自定义一个限定类型即可:

  • 行14:定义限定的文本
  • 行15:我们可以定义变量赋值为组合的类型,相当于一个别名
  • 行28:现在使用的时候,只要输入一个引号,即可出现提示

动态参数的玩法

前面的参数类型标注只是开胃菜,在 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 值

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-12-11,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 数据大宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 回调函数的参数
  • 限定文本
  • 动态参数的玩法
  • 字典也能自动提示?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com