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

Jar*_*ith 3 python functional-programming python-3.x

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

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
Run Code Online (Sandbox Code Playgroud)

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

foo = partial(bar, someparam)
Run Code Online (Sandbox Code Playgroud)

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

@_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(...))
Run Code Online (Sandbox Code Playgroud)

AFAICT log_error = _log_error(logger) / @log_error@_log_error(logger)看起来完全有效的生成装饰器的方法,它在正常声明的函数上工作正常.但是当试图在部分应用的函数上使用时,我在开始时得到语法错误foo =,并且在使用装饰器时获得优秀资源的google搜索,并且functools.partial通常在这个特定情况下没有给我任何东西.

Ara*_*Fey 5

装饰器不适用于作业.但是因为使用装饰器与调用装饰器是一样的,所以你可以这样做

foo = _log_error(logger)(partial(bar, someparam))
Run Code Online (Sandbox Code Playgroud)