Реализация условного декоратора - PullRequest
0 голосов
/ 30 мая 2018

Я хочу иметь условный декоратор.Ниже приведен мой код: -

def int_decorator(func):  # checks whether the args passed is of type int.
    def wrapper(*args, **kwargs):
        a, b = args
        if not (isinstance(a, int) and isinstance(b, int)):
            return
        return func(*args, **kwargs)
    return wrapper


decorator_mapping = {
    'int': int_decorator
}

class conditional_decorator(object):
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        decorator = decorator_mapping.get(kwargs.get('decorator'))
        if not decorator:
            # Return the function unchanged, not decorated.
            return self.func(*args, **kwargs)
        return decorator(self.func(*args, **kwargs))


@conditional_decorator
def func(a, b, *args, **kwargs):
    return(1)

print(func(1, 2, decorator='int'))

Что мне нужно, если в decorator_mapping существует какой-либо декоратор, который соответствует значению, переданному в func, затем примените тот же декоратор к функции, иначе не используйтеНе применяйте никакой декоратор.

Приведенный выше код хорошо работает, когда декоратор отсутствует, но не работает, когда декоратор найден.Это печатная ссылка function.

Где я не прав?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Декоратор принимает функцию, возвращает функцию.Эта строка:

    return decorator(self.func(*args, **kwargs))

должна быть:

    return decorator(self.func)(*args, **kwargs)
0 голосов
/ 30 мая 2018
def __call__(self, *args, **kwargs):
    decorator = decorator_mapping.get(kwargs.get('decorator'))
    if not decorator:
        # Return the function unchanged, not decorated.
        return self.func(*args, **kwargs)
    return decorator(self.func)(*args, **kwargs)

Вы хотите украсить функцию, а затем вызвать ее оформленную версию.

...