首页 > 解决方案 > 直接使用 args 调用 python 装饰器(即不包装另一个函数)

问题描述

假设我有一个装饰器,它本身可以接受参数,如下所示:


def my_decorator_with_args(decorator_arg):
    def decorator(func):
        @wraps(func)
        def inner(*args, **kwargs):
            # some arbitrary logic using the decorator_arg(s)
            if decorator_arg == 100:
                print(f'Not running {func}')

            else:
                return func(*args, **kwargs)

        return inner

    return decorator

和一些要装饰的功能,例如

def add(x,y): 
    return x + y

而且我想my_decorator_with_args直接作为高阶函数调用而不是用它装饰函数,我知道我可以执行以下操作:

from functools import partial 
p = partial(add, 1,2)
In [50]:z = my_decorator_with_args(100)(p)()                                                                                                                                                                                                                                                                                                                    
Out[50]: Not running functools.partial(<function add at 0x10db7a290>, 1, 2)

In [51]: z = my_decorator_with_args(99)(p)()                                                                                                                                                                                                                                                                                                                     

In [52]: z                                                                                                                                                                                                                                                                                                                                                       
Out[52]: 3

但是有没有更优雅/可读的方式来实现这一点?

标签: pythonpython-decoratorshigher-order-functions

解决方案


推荐阅读