Python 3.5+inspectфункция
inspect.isawaitable()
корутины и генераторы
Проверяет, можно ли объект поставить после await: корутина, Future, Task, объект с __await__ или генератор с @types.coroutine.
Синтаксис
inspect.isawaitable(object) -> bool
Проверяют объект, а не функцию: isawaitable(asyncio.sleep) даёт False, а isawaitable(asyncio.sleep(0)) — True. Обычный генератор ждать нельзя, а тот же генератор из функции с @types.coroutine — можно; именно так isawaitable отличает их. Типичное применение — API, принимающий и обычную, и асинхронную функцию обратного вызова: result = cb(); if inspect.isawaitable(result): result = await result.
Примеры
import asyncio, inspect
def sync_cb():
return 'sync'
async def async_cb():
return 'async'
async def call(cb):
result = cb()
if inspect.isawaitable(result):
result = await result
return result
print(asyncio.run(call(sync_cb)), asyncio.run(call(async_cb))) # → sync async
print(inspect.isawaitable(asyncio.sleep)) # → False — функция, а не объект
import inspect, types
def gen():
yield
@types.coroutine
def gen_coro():
yield
print(inspect.isawaitable(gen()), inspect.isawaitable(gen_coro())) # → False True
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности