类型标注

1. 动态类型与静态类型

静态与动态类型化是软件工程中的热门话题,每个人都有自己的独道简洁,python作为一种动态类型语言,这使得程序不需要指定变量的类型,这一点是不会改变的。但python创始人Guido van Rossum在python3.5中引入了一个类型系统,它允许开发人员指定变量类型,主要作用是便于开发维护代码,供IDE和开发工具使用,对代码运行不产生任何影响,运行时会过滤类型信息。

对于这个新的特性,我个人是非常喜欢的,python在构建大型项目上一直遭人诟病,除了自身性能在个别领域不尽如人意外,动态类型的语言特点也使得python并不适合构建大型项目。

构建大型项目对于python来说是一个技术可行但工程上困难重重的事情,设想你编写了一个函数,定义了若干个参数,期初你还记得这些参数的类型是什么,但天长日久,写了几万行代码之后你还会记得这个函数的参数最初都是如何定义的么?倘若你自己已经遗忘,又如何要求其他人能够读懂并维护你的代码呢?其他强类型语言诸如C++, java 在定义变量时必须指定其类型,因此在维护代码方面,及时缺少注释也仍然可以通过阅读代码来获取变量的信息,而python不可以,如果python开发人员不注意变量命名规则,也不喜欢写注释,相信我,python的代码真的很难理解和维护,尤其在使用了一大堆诸如装饰器等特性之后,理解起来更是难上加难。

2. 类型标注

先来看一个简单的示例来了解这个新的特性

def add(x: int, y: int)->int:
    return x + y


print(add(3, 4.3))

类型标注的使用并不复杂,只有两条规则:

  1. 使用:语句将信息附加到变量或函数参数中
  2. ->运算符用于将信息附加到函数/方法的返回值中

通过类型标注,你很容易就了解了使用add函数时的参数要求以及函数返回值的类型,不需要添加其他注释,而这并没有增加太多工作量。尽管类型标注注明了参数y是int类型,但实际调用函数时仍然可以传入float数据,因为类型标注仅仅被当做注释来处理,而不是强制的类型要求, python并没有据此进行类型推断和验证,也没有使用类型信息来优化生成的字节码以获得安全性或性能,一言以蔽之,类型标注就是一个另类的代码注释。

3. 强烈建议你使用类型标注

为了照顾大部分用户,本教程里的代码示例不会使用类型标注,毕竟这个新的特性还没有被广泛使用和接受,但我强烈建议你使用类型标注,它的好处实在太多了

3.1 易于理解代码

任何时候,我们阅读的代码,比自己写的代码要多得多,在代码旁边陈述了所有参数的类型和返回类型,可以大大加快了理解这个代码片段的过程。

3.2 易于重构

class Stu:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age


def out_stu(stu: Stu):
    print(stu.name, stu.age)

stu = Stu('小明', 14)
out_stu(stu)

我所使用的DIE是pycharm,在阅读函数out_stu时,由于标注了stu的类型是Stu,我可以通过command + 左键跟踪代码到类Stu,这就为我理解函数内部对stu处理增加了帮助,换做以前,你只能通过代码注释来了解stu是什么类型的数据,如果不幸,类的定义不在这个脚本里,也没有代码注释,你将无从下手。

pycharm一直有这样的代码定位功能,但此前由于缺少类型说明,函数的参数无法使用该功能定位到这个参数的类型。有了类型标注,可以让IDE具有100%的检测准确率。

3.3 易于使用库

大多数编辑器都提供了代码提示功能,由于python是动态类型语言,有些代码,无法确定变量的类型,这时他们就无法提供代码提示,这一点在编写函数尤为明显,由于函数的参数具体是什么类型的,只有在执行阶段才能确定,因此编辑无法在你编写函数时为你提供代码提示功能,但加了类型标注之后就变成了可能
python代码提示

由于已经加了类型标注,编辑器知道参数string是str类型,因此在编写代码时就可以为我们提供字符串可用的方法列表,这样可以加快代码编写的速度。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案