改变函数

时间:2017-02-28 15:21:34

标签: python

使用新版本的库我改变了几个函数的一个默认参数。因此,我想添加一个临时警告,当用户调用没有明确指定参数的函数时会发生这种警告(因此调用函数时会显示默认值)。

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

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

当我在没有my_function参数的情况下调用formatting并且formatting被指定为关键字参数时,该工作正常。 但是如何包含仅使用位置参数调用my_function的可能性?由于my_function('arg1', 'arg2', 'some_format')参数的重复,调用已装饰的TypeError将生成formatting

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

1 个答案:

答案 0 :(得分:1)

在python 3中,您可以使用inspect模块' 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