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
    

      

  • 相关阅读:
    python中普通函数调用协程
    python骚操作之内建方法的使用
    Python常量类
    python实用技巧之任务切分
    容易被忽视的python装饰器的特性
    C语言学习笔记
    python mongo存在插入不存在更新,同时指定如果不存在才插入的字段
    python使用ThreadPoolExecutor每秒并发5个
    mac使用crawlab
    线性表的顺序存储结构
  • 原文地址:https://www.cnblogs.com/zcsh/p/15017021.html
Copyright © 2011-2022 走看看