typing模块在上次文章里说下班搞完,然后就忘记了,今天看python datetime源码才想起来一直没有写总结,这次补上

前言

初次看python部分模块的源码的时候,会有好多困惑,有好多奇奇怪怪的写法不明白,按照python教程上定义函数,定义变量,不会加什么类型检查,刚开始学python的时候用的是python2.7, 看源码就不会碰到许多奇奇怪怪的写法,但从python3.5开始,你再看源码,就会看到参数,变量带着冒号,箭头这些东西,这些就是typing模块提供的,它的作用大概有以下:

  • typing模块的作用:
  1. 类型检查,防止运行时出现参数和返回值类型不符合。
  2. 作为开发文档附加说明,方便使用者调用时传入和返回参数类型。
  3. 该模块加入后并不会影响程序的运行,不会报正式的错误,只有提醒。

基础

简单的类型,例如 int/float/str类型

看一个python源码

def __init__(
self,
days: float = ...,
seconds: float = ...,
microseconds: float = ...,
milliseconds: float = ...,
minutes: float = ...,
hours: float = ...,
weeks: float = ...,
*,
fold: int = ...,
) -> None: ...

看这个类的初始化函数,参数都是以参数名:类型的形式来声明的,这个函数的返回结果通过箭头结果类型的形式声明结果的类型。如果用pycharm, 那么你初始化这个类,传入了不符合类型的参数,pycharm就会给出提示,但不影响程序执行,而且使用这些不需要从typing模块导入

复杂的类型

对于复杂的类型,例如列表,我们使用的时候要从typing模块导入,还可以标注列表里都是什么类型的数据

from typing import List
def func(a:int, b:str) -> List[int or str]:
list1 = []
list1.append(a)
list1.append(b)
return list1

这个函数的返回值是一个list, 包含数值和字符串

再看一个python源码

from typing import AnyStr, ClassVar, Optional, SupportsAbs, Tuple, Type, TypeVar, Union, overload

python---typing_数据 这个源码的文件头从typing模块引入了好多类型,大部分我们都不是很常见,我们看一个optional 函数tzname, 它的参数类型是Optional类型,这个类型的数据都是datetime, 我们再去看typing模块对Optional类型的定义

python---typing_python_02 看解释等价于Union[X, None], 那么我们接着去看Union的定义

python---typing_Python_03

看这一层套一层的,说白了就是为一个复杂的类型起个别名,这里就想到了c语言中的别名typedef,语言之间果然是相通的。

总结

理解这个模块,对于我而言,就是便于理解源码,感受大佬们的写的代码的意思,方便我使用,同时能增强代码的美观吧,实际编码的时候不会用到这种编码形式,还是习惯使用为函数写注释,例如文档字符串来表明参数,函数返回值的类型等,不管怎样,让我们拥抱新事物