# 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/)