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