Найти - Пользователи
Полная версия: декоратор
Начало » Python для новичков » декоратор
1 2
rascally_rabbit
Добрый день.

Помогите, пожалуйста, разобраться. Изучаю самостоятельно 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

Что я делаю не так?
Shaman
 # return result
Зачем оно закомментировано? Раскомментируйте и у вас останется всего одна ошибка.
rascally_rabbit
Да, но задание не выполнится.
Результат:
 start
end
10
rascally_rabbit
Рабочий вариант:
 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
4kpt_IV
А хотите интереснее задание?Попробуйте создать параметризированный декоратор.
Спасибо )))
Вечером буду разбираться.
Может примерную задачу сформулируете?
JOHN_16
rascally_rabbit
пусть декоратор принимает в качестве параметра сообщение которое должен печатать при начале и после выполнения функции. В вашем случае оно жестко прописано, а вот параметризация декоратора позволит вам иметь 1 декоратор для разных случаев, вместо написания N разных
rascally_rabbit
Правильно?
 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)
4kpt_IV
Было бы все хорошо, но Ваш декоратор пожрет все атрибуты функции. Строки кода, ее имя и т.п. Посмотрите в сторону functools, а именно wraps, чтобы сделать “совсем по-феншую”…
rascally_rabbit
Спасибо за совет.
Буду дальше разбираться )))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB