利用装饰器添加测试代码

把需要测试的代码放进装饰器,剔除代码冗余 

def rangtest(*argchecks):
    def decorator(func):
        if not __debug__:
            return func
        else:
            def on_call(*args,**kwargs):
                print('oncall:',args)
                for (idx, low,high) in argchecks:
                    if args[idx] < low  or args[idx] > high:
                        errmsg = 'argument %s not in %s...%s'%(idx,low,high)
                        raise TypeError(errmsg)
                return func(*args,**kwargs)
            return on_call
    return decorator

@rangtest((1,0,120))
def persinfo(name,age):
    print('%s is %s years old'%(name,age))
@rangtest([0,1,12],[1,1,31],[2,0,2018])
def birthday(m,d,y):
    print('birthday = {}/{}/{}'.format(m,d,y))

class Person:
    def __init__(self,name,job,pay):
        self.job = job
        self.pay = pay
    @rangtest([1,0.0,1.0])
    def giveraise(self,percent):
        self.pay = int(self.pay * (1+percent))

 

 

根据关键字测试:

def rangetest(**checks):
    def onDesc(func):
        code = func.__code__   #获取func的code对象
        inputArgs = code.co_varnames[:code.co_argcount] #获取参数名
        funcname = func.__name__    #函数名
        errmsg = "{funcname} error {key} not in {low} - {high}"
        def oncall(*args, **kwargs):
            posargs = list(inputArgs)
            posargs = posargs[:len(args)] #根据输入参数调整参数长度

            for key,(low,high) in checks.items():
                if key in kwargs:                   
                    if kwargs[key] < low or kwargs[key] > high:
                        raise TypeError(errmsg.format(funcname=funcname,key=key,low=low,high=high))
                elif key in posargs:
                    pos = posargs.index(key)
                    if args[pos] < low or args[pos] > high:
                        raise TypeError(errmsg.format(funcname=funcname, key=key, low=low, high=high))
            return func(*args,**kwargs)
        return oncall
    return onDesc



@rangetest(age=(1,120))
def fuck(name,high,weight,age):
   pass


fuck('123',1,2,0)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值