Python Glossary English

Python 3.10+contextlibпонятие

contextlib.aclosing

менеджеры

Асинхронный контекстный менеджер, гарантирующий вызов aclose() у асинхронного ресурса на выходе (Python 3.10+).

Синтаксис

async with contextlib.aclosing(thing): ...

Главный случай — асинхронные генераторы с try/finally: если выйти из async for через break или исключение, финализация генератора не произойдёт сразу: цикл событий выполнит aclose() позже, отдельной задачей после сборки генератора (а не доживших — в shutdown_asyncgens()), то есть в непредсказуемый момент и вне контекста итерации. aclosing делает закрытие детерминированным ровно в точке выхода из блока. Работает только с объектами, у которых есть aclose(); для синхронного close() — обычный closing().

Примеры

# Python 3.11+
import contextlib
import asyncio
print(hasattr(contextlib.aclosing, '__call__'))   # → True
print(issubclass(contextlib.aclosing, contextlib.AbstractAsyncContextManager))   # → True
cm = contextlib.aclosing('resource')
print(hasattr(cm, '__aenter__') and hasattr(cm, '__aexit__'))   # → True
print(asyncio.run(cm.__aenter__()))   # → resource
with contextlib.aclosing(None): pass   # → TypeError

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности