Skip to content

No error for singledispatch on generic types #11875

Description

@wrobell

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)

Activity

  1. AlexWaygood commented on Dec 30, 2021

    @AlexWaygood
    Member

    ^Note that the runtime error message has been recently improved by python/cpython#30050, which will appear in the next micro versions of 3.9, 3.10 and 3.11.

    The topic of whether to ever support generic aliases in singledispatch was also recently discussed, and rejected, in a third BPO issue here: https://bugs.python.org/issue46191

  2. AlexWaygood commented on Dec 30, 2021

    @AlexWaygood
    Member

    Also, note that three pseudo-types will be supported by singledispatch in 3.11: types.UnionType, typing.Union, and typing.Optional: https://bugs.python.org/issue46014

  3. hauntsaninja commented on Dec 30, 2021

    @hauntsaninja
    Collaborator

    If we wanted to add more special casing for singledispatch, could also add some disallow-any-generic special casing (see https://bugs.python.org/issue46191 )

    Edit: Oh I see Alex already linked that issue. But yeah, another potential mypy "feature"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugmypy got something wrongtopic-type-formTypeForm might fix this

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions