No error for singledispatch on generic types
Open
Nobody has claimed this yet.
bug
topic-type-form
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- PR merge metrics
- PR metrics pending
Description
Please consider
from functools import singledispatch
import typing as tp
@singledispatch
def f(x: tp.Any) -> None: pass
@f.register
def _f_list(x: list[int]) -> None: pass
if __name__ == '__main__':
f([1, 2, 3])
Then
$ mypy sp.py
Success: no issues found in 1 source file
# on import no error as well, so Mypy raising an error would be very useful
$ python -c 'import sp'
On runtime
$ python sp.py
Traceback (most recent call last):
File "/usr/lib/python3.10/functools.py", line 831, in dispatch
impl = dispatch_cache[cls]
File "/usr/lib/python3.10/weakref.py", line 416, in __getitem__
return self.data[ref(key)]
KeyError: <weakref at 0x7f390d605c60; to 'type' at 0x7f390e07bd00 (list)>
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3.10/functools.py", line 834, in dispatch
impl = registry[cls]
KeyError: <class 'list'>
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/wrobell/projects/rbfly/sp.py", line 11, in <module>
f([1, 2, 3])
File "/usr/lib/python3.10/functools.py", line 878, in wrapper
return dispatch(args[0].__class__)(*args, **kw)
File "/usr/lib/python3.10/functools.py", line 836, in dispatch
impl = _find_impl(cls, registry)
File "/usr/lib/python3.10/functools.py", line 783, in _find_impl
mro = _compose_mro(cls, registry.keys())
File "/usr/lib/python3.10/functools.py", line 744, in _compose_mro
types = [n for n in types if is_related(n)]
File "/usr/lib/python3.10/functools.py", line 744, in <listcomp>
types = [n for n in types if is_related(n)]
File "/usr/lib/python3.10/functools.py", line 743, in is_related
and issubclass(cls, typ))
TypeError: issubclass() argument 2 cannot be a parameterized generic
Some context (in general we need to be better at distinguishing between Python types and annotation types)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Reproduce the example in sp.py with mypy, then compare the static result with Python's runtime failure in functools singledispatch. Trace how mypy handles the @f.register annotation for list[int] and identify the relevant type-checking entry point. Done means the example produces a useful mypy error instead of reporting success.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100