asyncio.sleep — coroutine или Future?
@python_quizРазберем этот квиз
Короткий ответ: вызов asyncio.sleep() без await/Task возвращает объект-корутины, а не Future. Чтобы выполнение было запланировано и стало Future-подобным, корутину нужно обернуть в Task (через asyncio.create_task/ensure_future или запустить через loop).
Ниже — разбор с демонстрациями и анализом вариантов.
Быстрая демонстрация (тот же код, что в квизе)

Объяснение вывода: asyncio.sleep — асинхронная функция (async def), вызов возвращает объект корутины. Этот объект не является Future; он просто описывает отложенную работу.
Что происходит, если обернуть корутину в Task
Task — объект, который планирует выполнение корутины в loop и наследует поведение Future (можно ждать, проверять состояние, получать результат). Пример:

Ожидаемый вывод (пример):

Как видно, Task — это экземпляр asyncio.Task и одновременно рассматривается как asyncio.Future (Task наследует Future).
Альтернативы: ensure_future и await
- asyncio.ensure_future(coro) также принимает корутину и возвращает Task (если передали корутину) или просто возвращает переданный Future.
- await coro выполнит корутину и вернёт результат, но сам корутинный объект не станет Future — он исполняется в контексте, где loop создает и управляет Task за вас (внутри asyncio.run/await).
Пример ensure_future:

Кратко о различиях: coroutine vs Future vs Task
- Coroutine (объект корутины) — результат вызова async-функции. Это "описание" работы, которое нужно выполнить.
- Future — контейнер/место для результата асинхронной операции; можно ждать завершения, установить результат извне.
- Task — специальный Future, который запускает корутину в event loop; Task наследует Future.
Проверки, которые полезно знать:
- isinstance(coro_obj, asyncio.Future) — обычно False для сырых корутин.
- isinstance(task_obj, asyncio.Future) — True для Task.
- issubclass(asyncio.Task, asyncio.Future) — True (Task — подкласс Future).

Анализ вариантов (логика проверки)
- Вариант с типом, похожим на "<class 'coroutine'> False" соответствует поведению: корутина и не Future.
- Варианты, утверждающие, что вызов возвращает asyncio.Future или asyncio.Task, некорректны без явного создания Task/обёртки.
- Утверждение, что корутина — экземпляр asyncio.Task, неправильно: Task создаётся отдельно через create_task/ensure_future.
Итог
asyncio.sleep() при вызове (без await или обёртки) возвращает объект корутины, а не Future. Чтобы получить объект Future/Task, нужно явно запланировать корутину в loop (create_task/ensure_future) или выполнить её через await в асинхронной среде.