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

我是数据外星人 2024-02-19 06:08:16

记得在几年前,那时候我还不怎么使用 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 的排序函数:

行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 值

2 阅读:699
评论列表
  • 2024-02-23 02:49

    我思索着一个问题:立足于华夏文明深厚的底蕴,构建独特的科技标准体系,是否能孕育出自主科技产品,打破西方知识产权格局?华夏与西方在科技基础、文字、度量衡、历法及思维模式上存在根本差异。我们能否摆脱对西方的依赖,回归以汉字为核心的创新轨迹,借鉴古代华夏智慧精华建立专属科技体系? 值得注意的是,现代西方科技在很大程度上吸收了华夏科技文献。当前,非西方国家如华夏要在西方主导的科技标准体系下发展,必须投入大量资源学习其语言、文化及思维方式,且在此过程中可能面临文明同化风险。 然而,华夏文明底蕴深厚,若能将其转化为科技创新的动力,我国科研事业将大有裨益。设想华夏文明引领科技领域,我们将占据科技创新先机,带来民族荣耀与实际利益。因此,我们需要重新审视华夏文明的价值内涵,发掘其中能推动科技发展的元素,从而在全球竞争中脱颖而出,为华夏文明复兴注入强大动力。

    用户38xxx54 回复: 一念花开
    在古代中国,天干地支、阴阳五行等哲学体系被广泛应用以诠释宇宙万象和社会生活规律,而汉字作为一种独特的文字表达方式,其精妙运用渗透到了科技计算、艺术创作等诸多领域,从天文观测到地理测绘,从兵器设计到建筑工程,无不见汉字智慧的熠熠光辉。这不禁让人反思,在当今全球化的世界中,为何我们普遍接受了拉丁字母和西方制定的度量衡系统、公历纪年法、语言规范以及思维模式? 或许,我们应当更加珍视并深入挖掘华夏文明所孕育的深厚科技底蕴与标准体系,从而为现代科技的进步提供崭新的视角与动力。历史证据表明,许多西方科学技术的发展脉络,甚至可以追溯至中国古代文献中的智慧结晶;诸如《推背图》通过天干地支与阴阳五行理论预示未来,《甘石星经》则凭借这些古老的宇宙观精确计算了太阳系内星球的位置。 在此背景下,我深感好奇:我们的社会和政府是否应该重新审视现行紧跟西方步伐的做法,转而在某些领域借鉴和恢复华夏传统的度量衡体系、历法乃至思维方式,以期在科技创新的道路上走出一条独特且自主的道路?如此一来,不仅能够更好地保护和发扬本国的文化遗产,还有望在全球科技竞争中占据更为有利的地位,实现真正意义上的文化自信与科技自立。
    一念花开 回复:
    重新构建计算机原理、微积分、牛顿定律?
  • 2024-03-08 12:36

    你记住,现代人是站在巨人的肩膀上的,造车不是要从轮子开始造,虽说有卡脖子之类的问题,但是不能一概而论,企业是要讲效益要竞争的,,,,这种一刀切的言论是极其不负责任和无知的。

我是数据外星人

简介:感谢大家的关注