注解annotation
00 min
2024-4-23

为什么使用注解

Python是动态语言,变量可以随时被赋值并改变类型,也就是说Python的变量是运行时决定的。
动态语言缺点
  • 难发现:由于不能做任何类型检查,往往到了运行时问题才显现出来,或到了上线运行时才暴露出来
  • 难使用:函数使用者看到函数时,并不知道函数设计者的意图,如果没有详尽的文档,使用者只能猜测数据的类型。对于一个新的API,使用者往往不知道该怎么使用,对于返回的类型更是不知道该怎么使用
动态类型对类型的约束不强,在小规模开发的危害不大,但是随着Python的广泛使用,这种缺点确实对大型项目的开发危害非常大
如何解决这种问题呢?
  • 文档字符串。对函数、类、模块使用详尽的使用描述、举例,让使用者使用帮助就能知道使用方式。但是,大多数项目管理不严格,可能文档不全,或者项目发生变动后,文档没有更新等等。
  • 类型注解:函数注解、变量注解
文档字符串如何借助Pycharm进行简要编写呢:将函数主体编写完时候,在函数内第一行打出”””””” ,然后再中间回车自动生成对应模版,在注解中填写对应参数和返回值的类型即可。(Pycharm实现该功能:Settings --> Tools --> Python Integrated Tools,然后Docstring format 修改成 reStructuredText)

函数注解

  • 3.5版本引入
  • 对函数的形参和返回值类型做的辅助说明,非强制类型约束
  • 第三方工具,例如Pycharm就可以根据类型注解进行代码分析,发现隐藏的Bug
  • 函数注解存放在函数的属性__annotations__中,字典类型 。没有函数注解,则返回空字典。
 

类型注解

  • 3.6版本引入
  • 对变量类型的说明,非强制约束
  • 第三方工具可以进行类型分析和推断
 

类型检查

函数参数经常传错,如何检查?
可以在函数内部写isinstance来判断参数类型是否正确,但是检查可以看做不是业务代码,写在里面就是侵入式代码。那如何更加灵活的检查呢?
  • 非侵入式代码
  • 动态获取待检查的函数的参数类型注解
  • 当函数调用传入实参时,和类型注解比对
能否使用函数的__annotations__属性吗?虽然Python3.6之后,字典记录了录入序,但是我们还是要认为字典是无序的。那如何按照和按位置传实参对应呢?
使用inspect模块