Вы можете оптимизировать ваш код, организовав цикл с использованием `for` или `while`, чтобы избежать повторения кода. Также можно использовать обработку исключений для обработки возможных ошибок при выполнении запросов. Ниже представлен пример функции, которая повторяет запрос к API несколько раз, если ответ пустой:
```python
import requests
import time
def fetch_data(url, params, max_retries=3, wait_time=3):
"""
Выполняет запрос к API и возвращает ответ.
:param url: URL API
:param params: Параметры запроса
:param max_retries: Максимальное количество попыток
:param wait_time: Время ожидания между попытками
:return: Ответ API или None, если все попытки не удались
"""
for attempt in range(max_retries):
response = requests.get(url, params=params)
# Проверяем, был ли получен ответ
if response.status_code == 200 and response.text:
return response.json() # Или response.text в зависимости от формата ответа
print(f"Попытка {attempt + 1}: Ответ пустой или ошибка. Повтор через {wait_time} секунд.")
time.sleep(wait_time) # Ждем перед повтором
print("Все попытки исчерпаны. Ответ пустой!")
return None
# Пример использования функции
url = "https://api.example.com/data"
params = {"key": "value"}
result = fetch_data(url, params)
if result is not None:
print("Полученные данные:", result)
else:
print("Не удалось получить данные.")
```
### Объяснение:
1. **Цикл `for`**: Мы используем цикл для выполнения запроса до трех раз (или заданного количества) до того, как сдаться.
2. **Проверка ответа**: Мы проверяем статус ответа и дальнейшее содержание (не пустой ли он). Если ответ удовлетворяет ожиданиям, мы возвращаем данные.
3. **Управление ожиданием**: Если ответ пустой или произошла ошибка, мы выводим сообщение и ждем заданное количество секунд перед следующей попыткой.
4. **Обработка ошибок**: Если после всех попыток данные все еще пустые или произошла ошибка, возвращаем `None`.
Такой подход позволяет легко управлять повторами и ожиданием, а также минимизирует дублирование кода.