File size: 1,029 Bytes
d91766b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import inspect
import functools
from typing import Any
def fetch_factory_name(factory: Any) -> str:
# unwrap decorated functions (inspect.unwrap works for functions with __wrapped__)
try:
orig = inspect.unwrap(factory)
except Exception:
orig = factory
# handle functools.partial
if isinstance(orig, functools.partial):
return fetch_factory_name(orig.func)
# class
if inspect.isclass(orig):
name = getattr(orig, "__qualname__", orig.__name__)
module = getattr(orig, "__module__", "")
# function
elif inspect.isfunction(orig):
name = getattr(orig, "__qualname__", orig.__name__)
module = getattr(orig, "__module__", "")
else:
# callable instance (object with __call__)
name = getattr(orig, "__name__", None) or orig.__class__.__name__
module = getattr(orig, "__module__", getattr(orig.__class__, "__module__", ""))
if module and module != "builtins":
return f"{module}.{name}"
return name
|