【问题标题】:How to create a function that can apply multiple decorators to another function?如何创建一个可以将多个装饰器应用于另一个函数的函数?
【发布时间】:2020-11-22 16:22:48
【问题描述】:

假设我有一个由多个装饰器装饰的函数。

# file.py

@deco1
@deco2('param')
@deco3(
    'multiple',
    'long',
    'params'
)
@deco4('multiple', 'params')
def foo():
    """Function foo
    """
    pass

我们只是说它看起来很脏。很脏。

我希望能够做这样的事情。

# another_file.py

@deco1
@deco2('param')
@deco3(
    'multiple',
    'long',
    'params'
)
@deco4('multiple', 'params')
def all_decorators_for_foo():
    ...
# file.py

from another_file import all_decorators_for_foo

@all_decorators_for_foo
def foo():
    """Yay!
    """
    ...

只是为了上下文,多个装饰器是 sanic 框架的 swagger 文档装饰器。

是否有可能在 python 中实现类似的功能?

This question 并没有以任何方式回答我的问题。无论如何,装饰器都可以堆叠在一起使用。我想要某种可以用来代替所有堆叠的装饰器的装饰器。

【问题讨论】:

  • 这能回答你的问题吗? How to make a chain of function decorators?
  • @bigbounty 不,绝对没有。请在将其标记为重复之前阅读该问题。
  • 您是否坚持将那些装饰器应用all_decorators_for_foo,或者您可以将它们作为参数传递给它吗?
  • @superbrain 任何有用的东西。我只是想让我的代码看起来很漂亮。但我也希望能够独立地为foo 添加更多装饰器。就像我希望 @deco1foo 和所有其他人一起分组一样。
  • @DiptangsuGoswami 您是否浏览了所附链接中的答案?如果没有看到这个 - stackoverflow.com/a/29163633/6849682。附加到您的问题的答案使用相同的概念 - decor1(decor2(func))(*args, **kwargs)。所以,这可能是重复的

标签: python python-3.x decorator python-decorators


【解决方案1】:

是的,你可以。您可以制作另一个装饰器来返回装饰函数,如下所示:
all_decorators_for_foo.py

def all_decorators_for_foo(func):
    return deco1()(
        deco2('param')(
            deco3(
                'multiple',
                'long',
                'params'
            )(
                deco4('multiple', 'params')(
                    func
                )
            )
        )
    )

然后在file.py

from another_file import all_decorators_for_foo

@all_decorators_for_foo
def foo():
    pass

【讨论】:

    猜你喜欢
    • 2015-08-14
    • 2021-03-22
    • 1970-01-01
    • 2021-06-22
    • 2021-01-14
    • 2021-12-12
    • 2016-03-14
    • 2021-11-29
    相关资源
    最近更新 更多