from __future__ import annotations import contextlib import inspect import os @contextlib.contextmanager def rewrite_exception(old_name: str, new_name: str): """ Rewrite the message of an exception. """ try: yield except Exception as err: if not err.args: raise msg = str(err.args[0]) msg = msg.replace(old_name, new_name) args: tuple[str, ...] = (msg,) if len(err.args) > 1: args = args + err.args[1:] err.args = args raise def find_stack_level() -> int: """ Find the first place in the stack that is not inside pandas (tests notwithstanding). """ import pandas as pd pkg_dir = os.path.dirname(pd.__file__) test_dir = os.path.join(pkg_dir, "tests") # https://stackoverflow.com/questions/17407119/python-inspect-stack-is-slow frame = inspect.currentframe() n = 0 while frame: fname = inspect.getfile(frame) if fname.startswith(pkg_dir) and not fname.startswith(test_dir): frame = frame.f_back n += 1 else: break return n