Менеджери асинхронного контексту

Оновлено: 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__(), завершується помилкою, тоді загальна операція не підтримується, тому відображений метод не викликається .