Skip to content

Instantly share code, notes, and snippets.

View Andykl's full-sized avatar
🦆

Andrej Klychin Andykl

🦆
View GitHub Profile
@Andykl
Andykl / cmv2.py
Created April 17, 2023 22:25
Python context manager protocol extension, __with__ approach
from __future__ import annotations
def default___with__(obj, depth):
# Exception in __enter__ should be propagated.
enter_result = obj.__enter__()
try:
yield enter_result
except BaseException as e:
if not obj.__exit__(type(e), e, e.__traceback__):
@Andykl
Andykl / cmv2.py
Last active February 2, 2024 19:41
Python context manager protocol extension
from __future__ import annotations
def CMProtocolV2(typ):
# Copy from contextlib._GeneratorContextManager
def __enter__(self):
self._gen = self.__with__()
try:
return next(self._gen)
except StopIteration:
@Andykl
Andykl / cmv2.py
Last active April 14, 2023 13:05
Python context manager protocol v2
from __future__ import annotations
class CMProtocolV2:
def __init__(self, manager_expr: str, manager_name: str | None = None, result_name: str | None = None):
self.manager_expr = manager_expr
self.manager_name = manager_name
self.result_name = result_name
self._inited_manager = None