Менеджери асинхронного контексту
Оновлено: 28.04.2023
Асинхронний контекстний менеджер — це контекстний менеджер, який може призупинити виконання своїх методів __aenter__ і __aexit__.
Асинхронні менеджери контексту можна використовувати в операторі async with.
object.__aenter__(self) Семантично подібний до __enter__(), єдина відмінність полягає в тому, що він повинен повертати waitable.
object.__aexit__(self, exc_type, exc_value, traceback) Семантично подібний до __exit__(), єдина відмінність полягає в тому, що він повинен повертати waitable.
Приклад класу диспетчера асинхронного контексту:
class AsyncContextManager:
async def __aenter__(self):
await log('entering context')
async def __aexit__(self, exc_type, exc, tb):
await log('exiting context')
Виноски
1 У деяких випадках можливо змінити тип об’єкта за певних контрольованих умов. Загалом це не дуже гарна ідея, оскільки це може призвести до дуже дивної поведінки, якщо з ним поводитись неправильно. 2 Методи __hash__(), __iter__(), __reversed__() і __contains__() мають спеціальну обробку для цього; інші все одно викличуть TypeError, але можуть зробити це, покладаючись на поведінку, що None не викликається. 3 «Не підтримує» тут означає, що клас не має такого методу, або метод повертає NotImplemented. Не встановлюйте для методу значення None, якщо ви хочете примусово повернутися до відображеного методу правого операнда — це натомість матиме протилежний ефект явного блокування такого резерву. 4 Для операндів одного типу передбачається, що якщо невідбитий метод, наприклад __add__(), завершується помилкою, тоді загальна операція не підтримується, тому відображений метод не викликається .