• 基于装饰器的python参数类型检查


    基于装饰器和inspect模块对函数参数类型进行检查。

    from functools import wraps
    from inspect import signature
    def assert_type(*type_args, **type_kwargs):
    def is_type(value, tpe):
    return isinstance(value, tpe)

    def dec(fn):
    sig = signature(fn)
    bound_types = sig.bind_partial(*type_args, **type_kwargs).arguments

    @wraps(fn)
    def wrapper(*args, **kwargs):
    bound_values = sig.bind(*args, **kwargs)
    for name, value in bound_values.arguments.items():
    if name in bound_types:
    if not is_type(value, bound_types[name]):
    raise TypeError('Argument {} must be {}'.format(name, bound_types[name]))
    return fn(*args, **kwargs)

    return wrapper

    return dec

      上面的代码中,使用inspect中的signature方法获取了fnSignature签名,然后使用bind_partial方法创建了(*type_args, **type_kwargs)func参数的映射(也就是一个字典)。

    # 使用
    @assert_type(a=int, b=int) def add(a, b=1):   return a+b

      向量化版本:

    def vectorized_assert_type(*type_args, **type_kwargs):
        @np.vectorize
        def is_type(value, tpe):
            return isinstance(value, tpe)
    
        def dec(fn):
            sig = signature(fn)
            bound_types = sig.bind_partial(*type_args, **type_kwargs).arguments
    
            @wraps(fn)
            def wrapper(*args, **kwargs):
                bound_values = sig.bind(*args, **kwargs)
                for name, value in bound_values.arguments.items():
                    if name in bound_types:
                        if not is_type(value, bound_types[name]).all():
                            raise TypeError('Argument {} must be {}'.format(name, bound_types[name]))
    
                return fn(*args, **kwargs)
    
            return wrapper
    
        return dec
    

      

  • 相关阅读:
    在mac上搭建python环境
    iOS开发-你真的会用SDWebImage?(转发)
    iOS tableview 优化总结
    Masonry 实现输入框随键盘位置改变
    sudo 权限问题
    nodejs save遇到的一个坑
    iOS app的webview注入JS遇到的坑
    HW18-广搜
    HW17-深搜
    HW16-动归2
  • 原文地址:https://www.cnblogs.com/zcsh/p/15017021.html
Copyright © 2020-2023  润新知