@ElefanObi

Почему декоратор удаляет аргументы?

Написал простую функцию

test.py

from decorators import decorator_maker
from exceptions import CustomException


@decorator_maker(delay=4)
def decorated_test_func(*args, **kwargs):
    print('Function')
    print('args:', args)
    if args[0] == 1:
        print('Raising exception')
        raise CustomException
    return True


decorated_test_func(2, 5)


decorators.py

from exceptions import CustomException


def decorator_maker(delay=0):
    def do_if_raisen(func):
        def wrap(self, *args, **kwargs):
            try:
                if delay !=0:
                    raise CustomException
                return func(*args, **kwargs)
            except CustomException as e:
                print('delay:', delay) 
                print(e)
                print('Code delayed for {s} sec.'.format(s=delay))
                sleep(delay)
                return func(*args, **kwargs)

        return wrap
    return do_if_raisen


Если запустить ее с закомментированной строкой с декоратором
# @decorator_maker(delay=4)
то получим это:
>>python test.py
>>Function
>>args: (2, 5)

Если же ее раскомментировать, то результат сильно изменится:
>>python test.py
>>delay: 4
>>Message: None

>>Code delayed for 4 sec.
>>Function
>>args: (5,)


Куда делся аргумент из кортежа args?
  • Вопрос задан
  • 59 просмотров
Решения вопроса 1
@deliro
Агрессивное программирование
В self ушёл, очевидно. Отладчиком начни пользоваться и подобные вопросы отпадут
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы