python装饰器-实现校验函数形参类型

需要掌握装饰器和函数签名

from inspect import signature
import functools 
def checkparam(*ty_args,**ty_kargs):
    def decorator(func):
        sig = signature(func)
        btypes = sig.bind_partial(*ty_args,**ty_kargs).arguments
        @functools.wraps(func)
        def wrapper(*args,**kargs):
            #arg in d,instance(arg,d[arg])
            for name, obj in sig.bind_partial(*args,**kargs).arguments.items():
                if name in btypes:
                    if not isinstance(obj,btypes[name]):
                        raise TypeError('"%s" must be "%s"' %(name,btypes[name]))

            return func(*args,**kargs)
        return wrapper
    return decorator

测试调用

@checkparam(str,int,list)
def fun(name,age,likes):
    print(name,age,likes)

fun('哈哈',20,['王者荣耀','抖音'])

原文出处:/show_1EF2LrdJI0fo.html