import inspect
def type_assert(*ty_args, **ty_kwargs):
def decorator(func):
# A...
func_sig = inspect.signature(func)#提取函数签名
bind_type = func_sig.bind_partial(*ty_args, **ty_kwargs).arguments
def wrap(*args, **kwargs):
# B...
for name, obj in func_sig.bind(*args, **kwargs).arguments.items():
type_ = bind_type.get(name)
if type_:
if not isinstance(obj, type_):
raise TypeError('%s must be %s' % (name, type_))
return func(*args, **kwargs)
return wrap
return decorator
@type_assert(c=str)
def f(a, b, c):
pass
f(5, 10, 5.3)
【python】定义带参数的装饰器,用装饰器限制函数的参数类型
最新推荐文章于 2021-11-29 09:23:47 发布