Форум сайта python.su
Добрый день.
Помогите, пожалуйста, разобраться. Изучаю самостоятельно Python 3.
Делаю задание по декораторам - написать декратор для функции, при вызове функции печатает “старт”, после окончания - “end”
Код:
def decorator_func(func): print("start") def result(*args, **kwargs): func(*args, **kwargs) print("end") # return result @decorator_func def test(a, b): print(a * b) test(2, 5)
start end Traceback (most recent call last): File "test.py", line 13, in <module> test(2, 5) TypeError: 'NoneType' object is not callable
Офлайн
# return result
Офлайн
Да, но задание не выполнится.
Результат:
start end 10
Офлайн
Рабочий вариант:
def decorator_func(func): def result(*args, **kwargs): print("start") func(*args, **kwargs) print("end") return result @decorator_func def test(a, b): print(a * b) test(2, 5)
Офлайн
А хотите интереснее задание?
Попробуйте создать параметризированный декоратор.
Офлайн
4kpt_IVСпасибо )))
А хотите интереснее задание?Попробуйте создать параметризированный декоратор.
Офлайн
rascally_rabbit
пусть декоратор принимает в качестве параметра сообщение которое должен печатать при начале и после выполнения функции. В вашем случае оно жестко прописано, а вот параметризация декоратора позволит вам иметь 1 декоратор для разных случаев, вместо написания N разных
Офлайн
Правильно?
def add_msg(start_msg, end_msg): def some_decorator(func): def result(*args, **kwargs): print(start_msg, func.__name__) func(*args, **kwargs) print(end_msg, func.__name__) return result return some_decorator @add_msg("старт функции", "завершение функции") def test(a, b): print(a * b) test(2, 5)
Отредактировано rascally_rabbit (Сен. 23, 2016 11:24:25)
Офлайн
Было бы все хорошо, но Ваш декоратор пожрет все атрибуты функции. Строки кода, ее имя и т.п. Посмотрите в сторону functools, а именно wraps, чтобы сделать “совсем по-феншую”…
Офлайн
Спасибо за совет.
Буду дальше разбираться )))
Отредактировано rascally_rabbit (Сен. 23, 2016 14:32:33)
Офлайн