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)