Issue 46821: Introspection support for typing.overload (original) (raw)

Currently, the implementation of @overload (https://github.com/python/cpython/blob/59585d6b2ea50d7bc3a9b336da5bde61367f527c/Lib/typing.py#L2211) simply returns a dummy function and throws away the decorated function. This makes it virtually impossible for type checkers using the runtime function object to find overloads specified at runtime.

In pyanalyze, I worked around this by providing a custom @overload decorator, working something like this:

_overloads: dict[str, list[Callable]] = {}

def _get_key(func: Callable) -> str: return f"{func.module}.{func.qualname}"

def overload(func): key = _get_key(func) _overloads.setdefault(key, []).append(func) return _overload_dummy

def get_overloads_for(func): key = _get_key(func) return _overloads.get(key, [])

A full implementation will need more error handling.

I'd like to add something like this to typing.py so that other tools can also use this information.