需要掌握装饰器和函数签名
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,['王者荣耀','抖音'])