Свой отдельный метод. class A: def init(self): ... async def ainit(self): ... foo = A() await foo.ainit()
А мне надо в конструкторе сессию асинхронную поднять, как тогда сделать? UPD. Через 1 сессию в aiohttp можно же кидать несколько раз запросы?
покажи код, может, и не нужно
Зачем? Сделай тогда пустой инит, а сразу после вызывай свой асинхронный
Сессия как раз для того и нужна, чтобы её один раз создать, и дальше её использовать для большого числа запросов
Так я в конструкторе её создать хочу, у меня обёртка для api app = TApi(key=key) await app.minus() # отнимит в сессии await app.balance() # и через ту же сесиию напишет баланс например
Сессия — это ресурс, который нужно закрывать. Так же как и файл. Поэтому её нужно использовать в контекстом менеджере, как показано в документации: async with ClientSession() as session: ... Так что тут у тебя два варианта: 1. передавать сессию явно (не очень хорошо, потому что то, что используется aiohttp — в общем-то деталь реализации) async with ClientSession() as session: app = TApi(session, key=key) await app.minus() await app.balance() 2. сделать TApi асинхронным контекстным менеджером async with TApi(key=key) as app: await app.minus() await app.balance() Тут можно в __aenter__ создать себе сессию и всё остальное. А в __aexit__ их закрыть. 3. Сделать отдельно стоящий контекстный менеждер import contextlib @contextlib.asynccontextmanager async def create_tapi(key): async with ClientSession() as session: yield TApi(session, key=key)
Да, я не знаю про них
Про контекстные менеджеры: https://realpython.com/python-with-statement/ contextlib: https://docs.python.org/3/library/contextlib.html
То есть функцию саму надо писать в aenter?
Обсуждают сегодня