Python Async to Sync | Cododel
CODODELDEV
EN / RU
Back to Deck
[snippet]

Python Async to Sync

ИСХОДНИК Python
ВЕРСИЯ 1.0
АВТОР Cododel

Простая утилита для синхронного выполнения асинхронных функций с корректным сохранением типов. IDE правильно определит тип возвращаемого значения благодаря использованию TypeVar.

Проблема

При обычном вызове asyncio.run() IDE теряет информацию о типе:

async def fetch_book(id: int) -> BookModel:
...
# IDE не знает, что это BookModel
book = asyncio.run(fetch_book(123))

Решение

Функция sync_await с правильной типизацией через TypeVar:

book = sync_await(fetch_book(4325)) # ✅ IDE корректно определяет тип как BookModel
print(book.title) # Автодополнение работает!

Использование

example.py

from sync_await import sync_await
class BookModel(BaseModel):
id: int
title: str
content: str
async def fetch_book(id: int) -> BookModel:
...
if __name__ == "__main__":
book = sync_await(fetch_book(4325)) # IDE корректно определит тип переменной book
print(book.title)

Исходный код

sync_await.py

from typing import Coroutine, TypeVar, Any
import asyncio
from pydantic import BaseModel
T = TypeVar('T')
def sync_await(coroutine: Coroutine[Any, Any, T]) -> T:
return asyncio.run(coroutine)

Как это работает

  1. TypeVar('T') - создает универсальную типовую переменную
  2. Coroutine[Any, Any, T] - корутина, возвращающая тип T
  3. -> T - функция возвращает тот же тип T
  4. IDE видит связь между типом корутины и результатом
[ ▲ 0 ]