python-函数参数类型检查

python在3.5后引入了参数类型注解,例:

def add(x:int,y:int)->int:#对x,y和返回值都进行注释,为int类型
	return x + y

注:注解是对函数参数和返回值的‘注释’,没有强制定义的作用(因为python是动态语言啊)

那么既然注解不能强制定义类型,在函数调用中怎么判断传入的参数是否是我想要的呢?
在次引入python的inspect模块
inspect模块主要提供了两种用处:

  1. 对是否是模块,框架,函数等进行类型检查
  2. 获取类或函数的参数的信息
import inspect
def add(x:int,y=5:int)->int:
	return x + y
#1、类型检查
inspect.isfunction(add)#判断add是否是函数
inspect.ismethod(add)#判断add是否是类的方法
inspect.isgenerator(add)#判断add是否是生成器对象
inspect.isclass(add)#判断add是否是类
...#还有很多is函数,详情请查阅inspect模块帮助
#2、获取参数信息
sig=inspect.signature(add)#获得函数的签名
>> <Signature (x:int, y:int=5) -> int>
params=sig.parameters #获取函数的参数信息
>> mappingproxy({'x': <Parameter "x:int">, 'y': <Parameter "y:int=5">})

parameters 是inspect下的一个类,可以把它看做是一个有序字典,里面存放了函数的参数和参数类型,可以取parameters.keys()和parameters.values(),其中遍历parameters.values()的annotation属性会得到参数的注解类型:

values=list(parameters.values())#把结果放到list中方便遍历
for i in values:
	print(values[i].annotation)#逐一打印参数的注解类型,
>>int
>>int

下面实现一个函数的参数类型检查的装饰器函数:

import inspect
def check(fn):
	def wrapper(*args,**kwargs):
        sig=inspect.signature(fn)
        params=sig.parameters
        values=list(params.values())
        for i,p in enumerate(args):
            if not isinstance(p,values[i].annotation):#判断传入参数的类型和参数注解类型是否相等
                print('TypeWrong')
        for k,v in kwargs.items():
            if not isinstance(v,params[k].annotation):
                print('TypeWrong')
        return fn(*args,**kwargs)
    return wrapper

@check
def add(x:int,y=5:int)->int:
	return x + y
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值