Оператор 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 класу.