如何在Python 3中修饰部分应用的函数?

时间:2017-02-23 16:34:20

标签: python python-3.x functional-programming

我创建了一个装饰工厂,它由自定义日志记录功能参数化,如下所示:

def _log_error(logger):
    def decorator(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            try:
                return f(*args, **kwargs)
            except Exception as e:
                logger(e)
                return None
        return wrapper
    return decorator

我现在想用它来装饰部分应用的函数foo:

foo = partial(bar, someparam)

我已经尝试了以下所有方法:

@_log_error(logger)
foo = partial(bar, someparam)

log_error = _log_error(logger)
@log_error
foo = partial(...)

foo = partial(...)
@log_error
foo

@log_error
(foo = partial(...))

AFAICT log_error = _log_error(logger) / @log_error@_log_error(logger)似乎都是生成装饰器的完全有效的方法,它在正常声明的函数上工作正常。但是当尝试使用部分应用的函数时,我在foo =的开头得到了语法错误,并且在使用装饰器时获得了很好的资源,而functools.partial通常没有给我任何关于此特定内容的信息。情况下。

1 个答案:

答案 0 :(得分:5)

装饰师不参与作业。但是因为使用装饰器与调用装饰器是一样的,所以你可以做到

foo = _log_error(logger)(partial(bar, someparam))