介绍一个非常有效的Python进行入参合法性检测的方法

介绍一个非常有效的Python进行入参合法性检测的方法

前言

由于 python 不支持函数入参类型的限定,所以,对于 python 来说,入参合法性检测显得尤为重要。

比如,我们要实现一个整数的加法运算函数,要进行入参检测,一般会这么写,非常的不 pythonic。

介绍一个非常有效的Python进行入参合法性检测的方法

介绍一个非常有效的Python进行入参合法性检测的方法

要想改一下代码,其实也没优雅到哪去,半斤八两。

介绍一个非常有效的Python进行入参合法性检测的方法

铺垫

今天,为大家介绍一种 pythonic 的入参合法性校验方法。介绍这个方法之前,需要介绍一下 PEP 3107 之 Function Annotations。这个是 python3 才支持的一个特性,可以为函数的参数进行注解,如下所示。

介绍一个非常有效的Python进行入参合法性检测的方法

当然,也可以对函数的返回值进行注解,如下所示。

介绍一个非常有效的Python进行入参合法性检测的方法

这个很有用,别人看到你的源码的时候,通过注解,就可以你这个参数应该传什么进去,还有就是,当别人用 help 来显示你写的函数的 docstring 时,这些注释也会显示。

介绍一个非常有效的Python进行入参合法性检测的方法

实际上,这些注释是藏在 __annotations__ 字段里的,通过如下指令可以显示。

介绍一个非常有效的Python进行入参合法性检测的方法

其实,不光是字符串,字典 __annotations__ 里的值可以是任何 object,可以是 list,可以是 tuple,甚至,可以是函数。

正文

到此为止,介绍一下更加 pythonic 的入参合法性校验方法,代码如下所示。

介绍一个非常有效的Python进行入参合法性检测的方法

其中,auto_type_checker 是一个修饰器,在函数定义的时候调用即可。函数在声明的时候,如果需要进行入参合法性校验的话,就用如下语法为函数的输入输出指定 checker。

介绍一个非常有效的Python进行入参合法性检测的方法

上述代码有 4 种 checker:

  • 不指定 checker,如 arg2,auto_type_checker 不会为 arg2 进行合法性校验;
  • type 型 checker,如 arg1,auto_type_checker 会检测 arg1 是否是 int 型,如果不是,会抛出异常,而返回值必须是 list 型,否则也会抛出异常;
  • 函数型 checker,如 arg4,auto_type_checker 会将 arg4 带入到 checker,如果 checker 的返回值是 Fasle,则抛出异常,上述代码中,arg4 只接受大于 0 的数字;
  • tuple/list 型 checker,如 arg3,tuple 或 list 中的所有元素都会被当作 checker,当所有 checker 都无法通过校验,则抛出异常,上述代码中,arg3 允许整数或浮点数。

这样声明函数,一是利用 PEP 3107 之 Function Annotations 特性为函数入参出参添加注释,调用者可以知道应该往函数里传入什么变量,另外只需要添加一行 @auto_type_checker 便可以实现入参出参的自动检测,非常的 pythonic。

介绍一个非常有效的Python进行入参合法性检测的方法

相关推荐