Python - Декораторы - как проверить функцию, возвращающую значение (f (args)) - PullRequest
0 голосов
/ 19 мая 2019

Я хочу проверить, равно ли возвращаемое значение из функции 1, и должно ли оно возвращать что-то еще (например, True). Это мой код:

from functools import wraps
def decorator(f):
    @wraps(f)
    def wrapping(*args,**kwargs):
        print (f(args))
        if f(args) == 1:
            return True
        return f(*args,**kwargs)
    return wrapping


@decorator
def f(x):
    return x

x=1
print(f(x))

и вывод:

(1,)
1

желаемый результат:

1
True

не уверен, как этого добиться. Спасибо

Ответы [ 2 ]

1 голос
/ 19 мая 2019

Вы не распаковываете свои аргументы. Когда вы используете упакованные аргументы с *args, **kwargs, python берет то, что передано в вашу функцию, и присваивает его переменной args как кортеж. Например:

def f(*args):
    print(type(args))
    print(args[0])
    print(args[-1])

f(1, 2, 3)

выдаст

<class 'tuple'>
1
3

Чтобы обойти это, вы можете распаковать переменные, как только они будут упакованы с *. В вашем примере:

from functools import wraps
def decorator(f):
    @wraps(f)
    def wrapping(*args,**kwargs):
        print (f(*args))  # <----- notice we are now unpacking args into
                          # the function x, removing the wrapped tuple
        if f(*args) == 1:
            return True
        return f(*args,**kwargs)
    return wrapping


@decorator
def f(x):
    return x

x=1
print(f(x))

это должно вывести ожидаемый результат.

1 голос
/ 19 мая 2019

Ваш код должен быть таким.

from functools import wraps


def decorator(f):
    @wraps(f)
    def wrapping(*args, **kwargs):
        result = f(*args, **kwargs)
        if result == 1:
            return True
        return result
    return wrapping


@decorator
def f(x):
    return x


x = 1
print(f(x))

Здесь функция вызывается один раз. Результаты получаются, а затем сравниваются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...