Python предлагает удобный способ работы с несколькими контекстными менеджерами через
with и async with. Но до сих пор смешивание синхронных и асинхронных менеджеров требовало глубокой вложенности или использования громоздких обходных решений, вроде чрезмерного применения AsyncExitStack.📪 PEP 806 предлагает разрешить использовать в одном
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'])
🔛 Меньше вложенности
🔛 Чёткая маркировка асинхронного кода
🔛 Легче читать и поддерживать
🌠 Полный текст PEP: https://clc.to/Kx-lqQ
🐸 Библиотека питониста
#буст