简单的反射使用案例
def strict(func):
sig = inspect.signature(func)
param_types = {
key: value.annotation
for key, value in sig.parameters.items()
if value.annotation is not value.empty
}
return_type = sig.return_annotation
@wraps(func)
def wrapper(*args, **kwargs):
param_values = sig.bind(*args, **kwargs)
for name, value in param_values.arguments.items():
if name in param_types:
if not isinstance(value, param_types.get(name)):
raise TypeError(f'Argument "{name}" must be {param_types[name]} but got {type(value)}')
res = func(*args, **kwargs)
if not isinstance(res, return_type):
raise TypeError(f'function need return {return_type} but got {type(res)}')
return res
return wrapper
@strict
def f(a: int, b: str = None, c: bool = False) -> str:
return a
print(f("2", ""))


网友评论