Bug report
Function decorated with both @singledispatch.register and @lru_chache fails with a cryptic error message.
EDIT: In python 3.14a6. It works in python 3.9~3.13.
Bug description:
import sys from functools import lru_cache, singledispatch, wraps from typing import Any, Callable def wrapped_lru_cache[T: Callable](maxsize: int = 1024) -> Callable[[T], T]: def decorator(func: T) -> T: @wraps(func) def wrapper(*args: Any, **kwargs: Any) -> Any: return lru_cache(maxsize=maxsize)(func)(*args, **kwargs) return wrapper # type: ignore return decorator if len(sys.argv) > 1 and sys.argv[1] == "--broken-in-py314": # does not work in python 3.14+ lru = lru_cache else: # workaround lru = wrapped_lru_cache @singledispatch def fun(x: str | tuple) -> int: raise TypeError(f"Input must be str or tuple not a {type(x)}") @fun.register @lru(maxsize=1024) # <- this def _(x: str) -> int: return len(x) @fun.register def _(x: tuple) -> int: sum = 0 for e in x: sum += fun(e) return sum if __name__ == "__main__": print(f"{fun("hello")=}") print(f"{fun(("hello", "sailor"))=}")
python ./singledispatch_mwe.py, but python ./singledispatch_mwe.py --broken-in-py314 produces the following error:
Traceback (most recent call last):
File ".../singledispatch_mwe.py", line 25, in <module>
@fun.register
^^^^^^^^^^^^
File "~/.local/share/uv/python/cpython-3.14.0a6-macos-aarch64-none/lib/python3.14/functools.py", line 963, in register
argname, cls = next(iter(get_type_hints(func, format=Format.FORWARDREF).items()))
In python 3.9~3.13 both of the above work.
CPython versions tested on:
3.9~3.14
Operating systems tested on:
macOS