Оператор async with

Оновлено: 24.04.2023

async_with_stmt ::=  "async" with_stmt

Асинхронний менеджер контексту (asynchronous context manager) — це менеджер контексту (context manager),який може призупинити виконання своїх методів enter і exit.

Наступний код:

async with EXPRESSION as TARGET:
    SUITE

семантично еквівалентний:

manager = (EXPRESSION)
aenter = type(manager).__aenter__
aexit = type(manager).__aexit__
value = await aenter(manager)
hit_except = False

try:
    TARGET = value
    SUITE
except:
    hit_except = True
    if not await aexit(manager, *sys.exc_info()):
        raise
finally:
    if not hit_except:
        await aexit(manager, None, None, None)

See also __aenter__() and __aexit__() for details.

Це SyntaxError, якщо використовувати оператор async with поза тілом функції співпрограми.

Виноски

1 Виняток поширюється на стек викликів, якщо немає пункту finally, який викликає інший виняток. Цей новий виняток призводить до втрати старого. 2 У відповідності за зразком послідовність визначається як одне з наступного: клас, який успадковує collections.abc.Sequence клас Python, зареєстрований як collections.abc.Sequence вбудований клас, який має встановлений біт (CPython) Py_TPFLAGS_SEQUENCE клас, який успадковує будь-який з перерахованих вище Наступні стандартні бібліотечні класи є послідовностями: array.array collections.deque list memoryview range tuple Примітка Значення суб’єктів типу str, bytes і bytearray не відповідають шаблонам послідовності. 3 У відповідності за шаблоном відображення визначається як одне з наступного: клас, який успадковує collections.abc.Mapping клас Python, зареєстрований як collections.abc.Mapping вбудований клас, який має встановлений біт (CPython) Py_TPFLAGS_MAPPING клас, який успадковує будь-який з перерахованих вище Класи стандартної бібліотеки dict і types.MappingProxyType є відображеннями. 4 Рядковий літерал, який з’являється як перший оператор у тілі функції, перетворюється на атрибут функції __doc__ і, отже, функцію docstring. 5 Рядковий літерал, що з’являється як перший оператор у тілі класу, перетворюється на елемент простору імен __doc__ і, отже, на docstring класу.