# Python Decorator **Срок выполнения**: до 28 марта 2024 года В данной лабораторной работе вам предстоит выполнить несколько заданий, каждое из которых следует сохранить в отдельном файле (В каждом файле должна быть **функция-декоратор**). Важные указания: - При выполнении заданий, обратите внимание на названия декораторов - они должны быть строго как в примерах. - Ваш вывод должен совпадать с выводом, приведенным в примерах, чтобы успешно завершить лабораторную работу. - Помните, декораторы должны быть универсальными и не быть привязанными к конкретной функции! Удачи в выполнении заданий! ## Задание 1 Напишите программу на Python для создания декоратора, который записывает аргументы и возвращаемое значение функции. Декоратор в этом коде записывает имя функции, аргументы и возвращаемое значение каждый раз, когда вызывается декорированная функция. ```python # Пример использования @decorator def multiply_numbers(x, y): return x * y # Вызов декорированной функции result = multiply_numbers(10, 20) print("Result:", result) ``` Пример вывода: ``` Calling multiply_numbers with args: (10, 20), kwargs: {} multiply_numbers returned: 200 Result: 200 ``` ## Задание 2 Напишите программу на Python для создания декоратора, который измеряет время выполнения функции. ```python # Пример использования @measure_execution_time def calculate_multiply(numbers): tot = 1 for x in numbers: tot *= x return tot # Вызов декорированной функции result = calculate_multiply([1, 2, 3, 4, 5]) print("Result:", result) ``` Пример вывода: ``` Function calculate_multiply took 0.0000 seconds to execute Result: 120 ``` ## Задание 3 Напишите программу на Python, которая реализует декоратор для кэширования результата функции. ```python # Пример использования @cache_result def calculate_multiply(x, y): print("Calculating the product of two numbers...") return x * y # Несколько вызовов декорированной функции print(calculate_multiply(4, 5)) # Вычисление выполняется print(calculate_multiply(4, 5)) # Результат извлекается из кэша print(calculate_multiply(5, 7)) # Вычисление выполняется print(calculate_multiply(5, 7)) # Результат извлекается из кэша print(calculate_multiply(-3, 7)) # Вычисление выполняется print(calculate_multiply(-3, 7)) # Результат извлекается из кэша ``` Пример вывода: ``` Calculating the product of two numbers... 20 Retrieving result from cache... 20 Calculating the product of two numbers... 35 Retrieving result from cache... 35 Calculating the product of two numbers... -21 Retrieving result from cache... -21 ``` ## Задание 4 Напишите программу на Python, которая реализует декоратор для ограничения частоты вызовов функции. ```python # Максимум 6 вызовов API разрешено. @rate_limits(max_calls=6, period=10) def api_call(): print("API call executed successfully...") # Выполнить вызовы API for _ in range(8): try: api_call() except Exception as e: print(f"Error occurred: {e}") time.sleep(10) api_call() ``` Пример вывода: ``` API call executed successfully... API call executed successfully... API call executed successfully... API call executed successfully... API call executed successfully... API call executed successfully... Error occurred: Rate limit exceeded. Please try again later. Error occurred: Rate limit exceeded. Please try again later. API call executed successfully... ``` ## Полезные ссылки [global и nonlocal](https://docs-python.ru/tutorial/opredelenie-funktsij-python/operatory-global-nonlocal/) [Raise](https://docs-python.ru/tutorial/oshibki-iskljuchenija-python/instruktsija-raise/) [args & kwargs](https://pythonim.ru/osnovy/args-kwargs-python) [Decorators](https://ravesli.com/decorators-python/)