Как создать функцию, которая может применять несколько декораторов к другой функции? - PullRequest
0 голосов
/ 02 августа 2020

Допустим, у меня есть функция, украшенная несколькими декораторами.

# 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!
    """
    ...

Просто ради контекста, несколько декораторов являются декораторами документации для sani * 1017. * framework.

Возможно ли в python добиться чего-то подобного?

Этот вопрос никоим образом не отвечает на мой вопрос. В любом случае декораторы можно складывать и использовать. Мне нужен какой-то декоратор, который можно использовать вместо всех уложенных друг на друга декораторов.

1 Ответ

3 голосов
/ 02 августа 2020

Да, можно. Вы можете сделать еще один декоратор, который возвращает декорированную функцию следующим образом: 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
...