Python编程高阶函数的应用(二)——利用语法糖(装饰器)判断参数类型

题目

作业:开发一个语法糖,实现参数的类型准确性.。
提示:在python中,大家都知道python的数据类型是弱类型,比如说函数只允许传字符串

我的做法

# 关键字参数问题,小作业的解答
def runtime(func):
    def get_time(*args, **kwargs):    #依次解决多参数,关键字参数问题
        for i in args:
            if not isinstance(i, str):
                print('NO!!')

        print(type(kwargs))
        
        for i, j in kwargs.items():
            if not isinstance(j, str):
                print('NO!!')
                
        func(*args, **kwargs)
        print(time.time())
    return get_time
    
    
@runtime
def student_run(i, j):
    print('学生跑!')
    
    
@runtime
def student_run1(*args, **kwargs):
#     if not(type(args)== str and type(kwargs) == str):
#         exit('NO!')
    print('学生1跑!')
    
@runtime
def student_run2():
    print('学生2跑!')

student_run(1, 2)
student_run1(5, 3, i = 1, j = 2)
student_run2()


# 关键字参数 key = value

大佬的做法

大佬一(薛玉洁)

import  inspect

def looger(fn):
    def wrapper(*args,**kwargs):
        sig = inspect.signature(fn)
        params = sig.parameters          # parames 是形参  是一个元素为二元结构的有序字典,OrderedDict([('x', <Parameter "x:int">), ('y', <Parameter "y:int">), ('z', <Parameter "z:int=3">)])               # args,kwargs 是实参
        va = list(params.values())       # 把字典中的值(形参)取出,用做列表处理
        for arg, param in zip(args, va):
            if param.annotation != inspect._empty and  not isinstance(arg, param.annotation):    #实参元素与形参元素进行对比判断类型
                raise TypeError("you must input {}".format(param.annotation))
        for k, v in kwargs.items():
            if params[k].annotation != inspect._empty and not isinstance(v, params[k].annotation):              #  实参中的K与形参中的K是一样的,K一样,只要进行value的类型判断即可
                raise TypeError("you must input {}".format(params[k].annotation))  
        cc = fn(*args, **kwargs)
        return cc
    return wrapper

@looger
def add(x: int, y: int, z: int):
    v = x + y + z
    return v
add(3,6,z =5)

大佬二(海绵宝宝)推荐!!!

编写装饰器required_types, 条件如下:
1). 当装饰器为@required_types(int,float)确保函数接收到的 每一个参数都是int或者float类型;
2). 当装饰器为@required_types(list)确保函数接收到的每一个
参数都是list类型;
3). 当装饰器为@required_types(str,int)确保函数接收到的每 一个参数都是str或者int类型;
4). 如果参数不满足条件, 打印 TypeError:参数必须为xxxx类 型

import functools

def required_types(*types):
    def required_int(fun):
        @functools.wraps(fun)
        def wrapper(*args,**kwargs):
            for i in args:
                if not isinstance(i,types):
                    print('TypeError',types)
                    #break
            else:
                inspect_res = fun(*args,**kwargs)
                return inspect_res
        return wrapper
    return required_int
@required_types(str,int)
def add(*args,**kwargs):
    print(args)
print(add(1,2,3,4,4,4,5,56,66,6,6,66,6,65,5,1))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值