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
    

      

  • 相关阅读:
    HDU 逃离迷宫 (bfs)
    HDU 2588 GCD (欧拉函数)
    HDU 诡异的楼梯 (bfs)
    oj 二叉树相关
    AVL树代码实现
    用栈实现队列
    redis学习
    15. 三数之和 (思维)
    889. 根据前序和后序遍历构造二叉树(非递归)
    寻找重复的子树(dfs)
  • 原文地址:https://www.cnblogs.com/zcsh/p/15017021.html
Copyright © 2011-2022 走看看