python / python/mypy

No error for singledispatch on generic types

Open
#11,875 3 comments 1 reaction 0 assignees View on GitHub

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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.