Два способа. Первый — класс с __enter__ и __exit__. __enter__ возвращает ресурс, __exit__ делает cleanup. Второй — генератор с декоратором @contextmanager из contextlib: yield разделяет setup и teardown. Код до yield — __enter__, после — __exit__. Если нужно обработать исключение — оберни yield в try/except. Генераторный способ компактнее, классовый — гибче (можно хранить состояние, переиспользовать). asynccontextmanager — для async контекстов.
Как создать свой context manager?
Middle
279 просмотровAFK Offer AI
Что такое Protocol и чем отличается от ABC?