首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

前言

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

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

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

铺垫

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

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

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

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

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

正文

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

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

上述代码有 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。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181230A1A0S800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券