Managing thirdparty package: defer.

This commit is contained in:
2026-05-13 05:09:23 -04:00
parent 8d6c91d306
commit 9266add6a1
10 changed files with 388 additions and 112 deletions
+32
View File
@@ -0,0 +1,32 @@
from contextlib import ExitStack
from types import FrameType
from typing import Any, Callable, Optional, ParamSpec, TypeVar
P = ParamSpec("P")
T = TypeVar("T")
class _Defer:
def __init__(self, tracefn: Optional[Callable]) -> None:
self.tracefn = tracefn or (lambda *_: None)
self._stack = ExitStack()
self._stack.__enter__()
def push(self, fn: Callable[P, T], *args: P.args, **kwargs: P.kwargs):
self._stack.callback(fn, *args, **kwargs)
def __call__(self, frame: FrameType, event: str, arg: Any):
self.tracefn(frame, event, arg)
match event:
case "call":
self._stack.__enter__()
case "return":
self._stack.__exit__(None, None, None)
self._stack = ExitStack()
case "exception":
self._stack.__exit__(*arg)
self._stack = ExitStack()
return self