def eval_in_context()

in chz/tiepin.py [0:0]


def eval_in_context(annot: str, obj: object) -> typing.Any:
    # Based on inspect.get_annotations
    if isinstance(obj, type):
        obj_globals = None
        module_name = getattr(obj, "__module__", None)
        if module_name:
            module = sys.modules.get(module_name, None)
            if module:
                obj_globals = getattr(module, "__dict__", None)
        obj_locals = dict(vars(obj))
        unwrap = obj
    elif isinstance(obj, types.ModuleType):
        obj_globals = getattr(obj, "__dict__", None)
        obj_locals = None
        unwrap = None
    elif callable(obj):
        obj_globals = getattr(obj, "__globals__", None)
        obj_locals = None
        unwrap = obj
    elif obj is None:
        obj_globals = None
        obj_locals = None
        unwrap = None
    else:
        raise TypeError(f"{obj!r} is not a module, class, or callable.")

    if unwrap is not None:
        while True:
            if hasattr(unwrap, "__wrapped__"):
                unwrap = unwrap.__wrapped__
                continue
            if isinstance(unwrap, functools.partial):
                unwrap = unwrap.func
                continue
            break
        if hasattr(unwrap, "__globals__"):
            obj_globals = unwrap.__globals__

    assert isinstance(annot, str)
    return eval(annot, obj_globals, obj_locals)