zoukankan      html  css  js  c++  java
  • 基于装饰器的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
    

      

  • 相关阅读:
    Pro ASP.NET Core MVC2
    vscode
    git命令使用
    单行函数
    过滤和排序
    oracle基本查询
    斐波那契数列的递归实现
    队列的顺序存储结构
    队列的链式存储结构
    折半查找法
  • 原文地址:https://www.cnblogs.com/zcsh/p/15017021.html
Copyright © 2011-2022 走看看