Python: декоратор, который возвращает другой декоратор - PullRequest
0 голосов
/ 14 октября 2019

У меня есть 2 класса, используемых в качестве декораторов

class A:
    """This is a decorator"""
    pass

class B:
    """This is also a decorator"""
    pass

И третий класс, который я хотел бы вернуть либо A, либо либо B

class C:
    def a(func):
        return A

    def b(func):
        return B


@C.a
def some_func(some_arg):
    pass

@C.b
def other_func(some_arg):
    pass

Возможно ли такое,и если да, то как это реализовать?

ОБНОВЛЕНИЕ: Проблема в том, что при создании декоратора ' вызов ' выполняется во время создания. Я хочу получить доступ к некоторым конфигурациям, которые будут установлены позже. Поэтому я в основном пытаюсь вернуть упаковщик, который возвращает упаковщик.

class C:
    def __call__(func):
        def wrapper(*args, **kwargs):
             # Do something with global data
             return func(*args, **kwargs)
        return wrapper

Ответы [ 2 ]

2 голосов
/ 14 октября 2019

Если вы хотите, чтобы ваш точный код работал, все, что вам нужно сделать, это изменить ваши методы на атрибуты:

class C:
    a = A
    b = B

Однако сомнительно, что это хорошая идея. Если вы хотите иметь декоратор, который выполняет одну из двух разных вещей, более подходящим может быть декоратор второго порядка (то есть функция, возвращающая декоратор).

0 голосов
/ 14 октября 2019

Вы можете сделать эту работу, изменив класс C на работу следующим образом.

class C:
    def a(func):
        return A(func)

Это действительно сводится к пониманию того, что декоратор - это просто синтаксический ярлык.

@dec
def f():
    pass

точно так же, как:

def f():
    pass
f = dec(f)
...