tgoop.com/pyproglib/7166
Create:
Last Update:
Last Update:
Python предлагает удобный способ работы с несколькими контекстными менеджерами через with
и async with
. Но до сих пор смешивание синхронных и асинхронных менеджеров требовало глубокой вложенности или использования громоздких обходных решений, вроде чрезмерного применения AsyncExitStack
.with
и синхронные, и асинхронные менеджеры, просто помечая асинхронные ключевым словом async
.
Пример старого подхода с глубокой вложенностью:
async def process_data():
async with acquire_lock() as lock:
with temp_directory() as tmpdir:
async with connect_to_db(cache=tmpdir) as db:
with open('config.json', encoding='utf-8') as f:
config = json.load(f)
await db.execute(config['query'])
С PEP 806 код станет компактнее и читаемее:
async def process_data():
with (
async acquire_lock() as lock,
temp_directory() as tmpdir,
async connect_to_db(cache=tmpdir) as db,
open('config.json', encoding='utf-8') as f,
):
config = json.load(f)
await db.execute(config['query'])
#буст