import sys from ast import ( AsyncFunctionDef, FunctionDef, ) from collections import deque from types import FrameType from typing import Any, Callable, Optional, cast from executing.executing import Executing, Source from defer.errors import FreeVarsError from defer.sugar.transformer import RewriteDefer class _ParseDefer: IDENTITY = lambda *_: None # noqa: E731 def __init__(self, tracefn: Optional[Callable]) -> None: self.tracefn = tracefn or self.IDENTITY self.pending: deque[Executing] = deque() def __call__(self, frame: FrameType, event: str, arg: Any): self.tracefn(frame, event, arg) if any( frame.f_code.co_filename.startswith(path) for path in { sys.base_exec_prefix, sys.base_prefix, sys.exec_prefix, sys.prefix, "", "