Ответ
Вызов асинхронной функции (корутины) без ключевого слова await
не запустит её выполнение. Вместо результата вернётся объект корутины (coroutine object
).
Этот объект представляет собой "рецепт" для выполнения асинхронной операции, который должен быть передан в цикл событий (event loop) для реального запуска.
Последствия:
- Код не выполняется: Логика внутри асинхронной функции не будет исполнена в момент вызова.
- Предупреждение
RuntimeWarning
: Начиная с Python 3.7, интерпретатор выдаст предупреждениеRuntimeWarning: coroutine '...' was never awaited
, чтобы помочь отловить эту частую ошибку. - Потенциальные баги: Программа будет работать некорректно, так как ожидаемое действие (например, сетевой запрос или работа с файлом) не произойдет.
Пример:
import asyncio
async def fetch_data():
print("Начинаю загрузку данных...")
await asyncio.sleep(1) # Имитация I/O операции
print("Данные загружены!")
return {"data": 123}
async def main():
print("Вызов без await:")
coro_obj = fetch_data() # Код внутри fetch_data() НЕ выполняется
print(f"Получен объект: {coro_obj}")
# Чтобы избежать RuntimeWarning, можно "забыть" задачу
# asyncio.create_task(coro_obj)
print("nВызов с await:")
result = await fetch_data() # Код выполняется, ожидаем завершения
print(f"Получен результат: {result}")
asyncio.run(main())
Вывод:
Вызов без await:
Получен объект: <coroutine object fetch_data at 0x...>
Вызов с await:
Начинаю загрузку данных...
Данные загружены!
Получен результат: {'data': 123}