контекст — менеджер контекст-менеджеров?

#python #contextmanager #asyncpg

Вопрос:

Я использую asyncpg . У меня есть класс Database с кучей методов для взаимодействия с моей базой данных. Проблема в том, что все эти методы должны иметь такой контекстный менеджер, как этот:

 async with (  self.pool.acquire() as conn,  conn.transaction() ):  

, что на самом деле не является повторным использованием кода.

Я попробовал это:

 class DBContextManager:  def __init__(self, pool):  self.pool: asyncpg.Pool = pool   async def __aenter__(self):  acquire_context = self.pool.acquire()  self.connection = await acquire_context.__aenter__()   self.connection._check_open()  self.transaction = Transaction(self.connection, None, False, False)  await self.transaction.__aenter__()  return self.connection   async def __aexit__(self):  await self.transaction.__aexit__()  await self.connection.__aexit__()  

, но это, похоже, не работает, и я сам не могу понять, почему:

 Traceback (most recent call last):  File "project/utils/database/api.py", line 54, in get_admins  async with DBContextManager(self.pool) as conn:  File "project/utils/database/api.py", line 25, in __aenter__  await self.transaction.__aenter__()  File "project/venv/lib/python3.10/site-packages/asyncpg/transaction.py", line 62, in __aenter__  await self.start()  File "project/venv/lib/python3.10/site-packages/asyncpg/transaction.py", line 104, in start  con._top_xact = self AttributeError: 'PoolConnectionProxy' object has no attribute '_top_xact'