利用python装饰器实现函数的“类型检查“

https://zhuanlan.zhihu.com/p/139056271

利用”装饰函数对被装饰函数进行一番操作然后再返回被装饰函数”这一操作,可以进行”python函数实参的类型检查”:

虽然动态语言python不对变量作出编译性质的类型声明,但可以使用装饰函数对被装饰函数进行”类型检查”

 

此例只是将”类型检查”的信息输出,如要实现”强制类型检查”,可以在wrapper()的类型检查语句中对”实参类型与形参类型不符”的情况抛出值错误异常:

def check(fn):
    def wrapper(*args,**kwargs):
        print(fn.__annotations__)#函数fn()的注释字典 '形参名':形参类型(按形参从左至右顺序)+'return':返回值类型
        list_anno_values=list(fn.__annotations__.values()) #按序的形参类型+返回值类型+'return':返回值类型 的列表
        print(list_anno_values) 
         
        for index,para in enumerate(args): #将位置形参按 整数下标:形参值 生成字典,为了获取位置形参对应下标来访问形参类型
            print('位置实参值:期望类型',para,':',list_anno_values[index],end='')
            print(isinstance(para,list_anno_values[index])) #位置形参肯定从形参列表第一个形参开始从左至右连续出现,故下表对应
            if not isinstance(para,list_anno_values[index]):
                raise ValueError   
         
        for k,v in kwargs.items():  #关键字形参 形参:形参值 的字典 通过str(形参)可从fn.__annotations__映射形参类型
            print('关键字实参',str(k),'的值:期望类型',v,':',fn.__annotations__[str(k)],end='')
            print(isinstance(v,fn.__annotations__[str(k)]))
            if not isinstance(v,fn.__annotations__[str(k)]):
                raise ValueError   
         
        ret=fn(*args,**kwargs)
    return wrapper

@check
def add(x:int,y:int,z:int)->int:
    return x+y+z

add(4,z=5,y=6)
add(2,'heihei')

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值