繁体   English   中英

更改功能的某些参数的装饰器

[英]Decorator that changes certain argument of function

在使用新版本的库时,我更改了几个函数的默认参数之一。 因此,我想添加一个临时警告,该警告在用户调用没有显式指定参数的函数时发生(因此函数以其默认值调用)。

只需添加警告函数并在每个基本函数中调用它即可轻松完成:

def warning(formatting):
    if formatting is None:
        sys.stderr.write("WARNING: The default format has changed to new_format")
        return 'new_format'
    return formatting

def my_function(arg1, arg2, formatting=None):
    formatting = warning(formatting)
    ...  # the following function code

但是,使用装饰器(出于代码可读性)来进行操作会更加方便。 所以我实现了这样的事情:

def check_default_format(fun):
    def warning(*a, **kw):
        if 'formatting' not in kw.keys() or kw['formatting'] is None:
            kw['formatting'] = 'new_format'
            sys.stderr.write("WARNING: The default format has changed to new_format")
        return fun(*a, **kw)
    return warning

@check_default_format
def my_function(arg1, arg2, formatting=None):
    ...  # the function code

当我不带formatting参数的情况下调用my_function且将formatting指定为关键字参数时,该方法将按预期工作。 但是如何包含仅使用位置参数才能调用my_function的可能性? 调用修饰的my_function('arg1', 'arg2', 'some_format')将由于重复formatting参数而产生TypeError

注意:我不能假设formatting始终是第3个参数,因为我需要装饰不同的功能。 我也无法更改参数顺序以保持向后兼容性。

在python 3中,您可以使用检查模块的Signature.bind_partial

def check_default_format(fun):
    @wraps(fun)
    def wrapper(*a, **kw):
        sig= inspect.signature(fun)
        args= sig.bind_partial(*a, **kw)

        if 'formatting' not in args.arguments or args.arguments['formatting'] is None:
            kw['formatting'] = 'new_format'
            sys.stderr.write("WARNING: The default format has changed to new_format")
        return fun(*a, **kw)
    return wrapper

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM