记得在几年前,那时候我还不怎么使用 vscode 编写 python,由于项目大多是数据处理相关,因此更多使用 jupyter notebook 。那写代码的体验感,用 "磕磕绊绊" 形容就再适合不过。
那时候我还填过两次关于在 vscode 编写 python 的体验调研问卷,最后我回复"希望 python 能与 typescript 一样,可以玩类型体操"。
随着前几年 python 作者重新复出并进入微软工作,真的感觉 python 的类型标注越来越靠近 typescript 了(typescript 是微软研发的前端语言)。
几年后的今天,我已经离不开 vscode 了,因为现在写代码是这样子:
今天,我们就盘点一些常见好用的类型标注使用方式。
今天介绍的许多标注类型可能不兼容 python 3.8 以下,但是官方特别制作了一个 typing_extensions 库
pip install typing_extensionsvscode 需要安装插件 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 值
我思索着一个问题:立足于华夏文明深厚的底蕴,构建独特的科技标准体系,是否能孕育出自主科技产品,打破西方知识产权格局?华夏与西方在科技基础、文字、度量衡、历法及思维模式上存在根本差异。我们能否摆脱对西方的依赖,回归以汉字为核心的创新轨迹,借鉴古代华夏智慧精华建立专属科技体系? 值得注意的是,现代西方科技在很大程度上吸收了华夏科技文献。当前,非西方国家如华夏要在西方主导的科技标准体系下发展,必须投入大量资源学习其语言、文化及思维方式,且在此过程中可能面临文明同化风险。 然而,华夏文明底蕴深厚,若能将其转化为科技创新的动力,我国科研事业将大有裨益。设想华夏文明引领科技领域,我们将占据科技创新先机,带来民族荣耀与实际利益。因此,我们需要重新审视华夏文明的价值内涵,发掘其中能推动科技发展的元素,从而在全球竞争中脱颖而出,为华夏文明复兴注入强大动力。
你记住,现代人是站在巨人的肩膀上的,造车不是要从轮子开始造,虽说有卡脖子之类的问题,但是不能一概而论,企业是要讲效益要竞争的,,,,这种一刀切的言论是极其不负责任和无知的。