Что нужно сделать
Реализуйте декоратор для декораторов: он должен декорировать другую функцию, которая должна быть декоратором, и даёт возможность любому декоратору принимать произвольные аргументы.
Пример использования:
@decorator_with_args_for_any_decorator
def decorated_decorator(func: Callable, *args, **kwargs):... # отсюда уже сами!
@decorated_decorator(100, 'рублей', 200, 'друзей')
def decorated_function(text: str, num: int) -> None:
print("Привет", text, num)
decorated_function("Юзер", 101)
Результат:
Переданные арги и кварги в декоратор: (100, 'рублей', 200, 'друзей') {}
Привет, Юзер 101
Что оценивается
- Результат вычислений корректен.
- Формат вывода соответствует примеру.
- Переменные, функции и собственные методы классов имеют значащие имена, не
a
,b
,c
,d
. - Классы и методы/функции имеют прописанную документацию.
- Есть аннотация типов для методов/функций и их аргументов (кроме
args
иkwargs
). Если функция/метод ничего не возвращают, то используетсяNone
.
def decorator_with_args_for_any_decorator(func):
""" Декоратор для приема аргументов другим декоратором"""
def inner(*args, **kwargs):
print(f'Переданные арги и кварги в декоратор: {args}, {kwargs}')
result = func(*args, **kwargs)
return result
return inner
@decorator_with_args_for_any_decorator
def decorated_decorator(func, *args, **kwargs):
"""Декоратор. Шаблон"""
def decorator(func):
def inner(*args, **kwargs):
result = func(*args, **kwargs)
return result
return inner
return decorator
@decorated_decorator(100, 'рублей', 200, 'друзей')
def decorated_function(text: str, num: int) -> None:
print("Привет", text, num)
decorated_function("Юзер", 101)