Replies: 5 comments
-
Пример декоратора со стака: def wrapper(*args, **kwargs):
if not asyncio.iscoroutinefunction(func):
with wrapping_logic():
return func(*args, **kwargs)
else:
async def tmp():
with wrapping_logic():
return (await func(*args, **kwargs))
return tmp()
return wrapper Какие подводные камни вы видите в этом? |
Beta Was this translation helpful? Give feedback.
-
Я думаю лучше создать две ветки с синхронной и асинхронной версии библиотеки, легче будет код поддерживать |
Beta Was this translation helpful? Give feedback.
-
Я топлю просто за создание AsyncClient рядом с Client. И создание асинхронного Request класса на aiohttp. Сделать два варианта установки через extras require. Будет так: Что касается сокращений у моделей, которые дергают классы Client, тооо... Создать каждому текущему сокращению по асинхронной альтернативе. Аля track.fetch_track() и await track.fetch_track_async() Максимально просто и дешево |
Beta Was this translation helpful? Give feedback.
-
Так как все модели вызывают методы клиента максимум один раз, модели можно не трогать совсем. Они могут спокойно возвращать корутину при использовании AsyncClient'а. Нужно будеть только в typehint добавить возвращаемое значение Было: class Artist:
...
def get_albums(...) -> Optional['ArtistAlbums']:
... Стало: from typing import Coroutine, Union
class Artist:
...
def get_albums(...) -> Union[Coroutine, Optional['ArtistAlbums']]:
... Выглядеть это все будет примерно так: Кликimport asyncio
import time
from typing import Coroutine, Union
class Client():
def test_method(self) -> str:
print('Method')
time.sleep(5)
return 'Return'
class ClientAsync():
async def test_method(self) -> str:
print('Async method')
await asyncio.sleep(5)
return 'Async retrun'
class TestModel:
def __init__(self, client: Client):
self.client = client
def short(self) -> Union[Coroutine, str]:
return self.client.test_method()
# Test sync
bar = TestModel(Client())
bar_result = bar.short()
print(bar_result)
# Test async
foo = TestModel(ClientAsync())
foo_result = asyncio.run(foo.short())
print(foo_result) |
Beta Was this translation helpful? Give feedback.
-
Асинхронная версия библиотеки была добавлена тут 62741be Финальное решение общими словами в 3 шага:
Все копирования и применения патчей работают автоматически через str.replace :) Добавление асинхронности заняло ~5 часов таким макаром |
Beta Was this translation helpful? Give feedback.
-
Очень хотелось бы иметь общую кодовую базу в репозитории с sync/async версией библиотеки.
Подходы, которые видел в других библиотеках:
Client
, можно написатьAsyncClient
. В нем будет использоваться классAsyncRequest
и выполнять запросы черезaiohttp
. Это покроет большую часть проекта, но, к сожалению, остаётся проблема в шорткатами в классах объектов. Хоть они и используют экземляр классаclient.request
, а самclient
пробрасывается в каждый объект, но сами шорткаты объявлены без ключевого словаasync
, а запрос вызывается безawait
.Если у вас свое видение или опыт в подобном – поделитесь, пожалуйста ✨
Beta Was this translation helpful? Give feedback.
All reactions