Python加入类型注解|散发着松散感的代码Python如此简洁,以至于编写者在声明变量时甚至不需要考虑类型。但在简单性和复杂性之间存在平衡。当我们写比较复杂的项目时,还是希望有“静态类型语言”强大的类型检查和智能提示。好消息是,不需要像TypeScript那样引入新的编译器来“升级”JavaScript进行类型检查。Python自带的打字工具在一定程度上可以把Python变成一种“静态类型语言”;坏消息是Python毕竟不是一种“静态类型语言”。经过我的简单测试,它的代码仍然是“自由散漫”的。Python的注释类型首先向读者声明我们的实验环境。?python--versionPython3.7.0本文参考了Python3.7的中文文档。我们声明一个变量,通过以下方式声明类型:a:int=1b:float=.2print(f'{a},{b}')#1,0.2可惜在Python中,a:int=1这句话是没有意义的。说白了,就是“脱裤子放屁”;说得好听一点,完全没有必要在这里使用Python的类型注解。首先,a=1中的解释器会自动将a推导为int类型,而Pylance等LanguageServers也会在我们编写时提供int方法补全。另外,即使我们指定a的类型为int,然后将str赋值给a,解释器和LanguageServer也根本不会报错。如下。a:inta='1'print(a)#这很令人困惑。现代编译技术做上面的类型检查应该不难,只是这里没有报错和警告。这大概和Python的设计理念有关。让我们看看TypeScript是如何表现的:TypeScript将自己视为一种静态类型语言,在编写时需要类型正确性。使用类型虽然Python不强制要求类型正确,会自动为我们做强类型转换,但我们仍然可以享受到类型注解带来的诸多便利。比如我们现在要定义一个函数foo,该函数返回一个列表dogList,列表中的元素是我们自定义类Dog的实例。没有类型注解,我们就无法获得IntelliSense,如下所示。Python从不要求List对象中的元素属于同一类型。因此,解释器或LanguageServer不会用“吃力不讨好”的方式运行程序,然后推导出你的List里有什么。类型。自然,当你从List中取元素时(比如上面的dogList[0]),它无法告诉你你取的是List中的什么类型的元素,也没有办法提示(Nosuggestion.)。这不符合实际的业务场景,因为我们在写代码的时候,经常会在一个列表中加载相同的类型。为了在获取元素时获得完成提示,我们可以使用typing.List+minimalgenerics。如下。我们规定foo返回的元素必须是一个List,元素类型是Dog类型。然后我们的dogList[0]也被识别为Dog类型,就完成了。舒服的。题外话:聪明的Pylance实际上可以自己进行一些类型推导。例如,当我们使用生成器生成列表时,Pylance会判断列表中的元素属于什么类型:结束语关于typing的用法还有很多值得讨论的地方。我的参考主要是:Python3.7打字中文文档。另外,使用Python泛型实现函数重载,相对于静态类型语言,貌似很麻烦(我参考了Python实战宝典(知识)一文),遇到合适的场景会写出来分享将来。我是小派,感谢您的关注!
