Python 严格的类型检测

2020-10-18  本文已影响0人  Gascognya

简单的反射使用案例

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", ""))
参数类型
返回值类型
上一篇 下一篇

猜你喜欢

热点阅读