У меня была функция, использующая functools.singledispatch
с generics break после обновления до версии 3.7. То, что раньше работало в 3.6:
>>> from functools import singledispatch
>>> from typing import Mapping
>>> @singledispatch
... def f(_):
... raise NotImplementedError
...
>>> @f.register(Mapping)
... def _(x):
... return x
...
, теперь повышает
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/user/cpython/Lib/functools.py", line 831, in register
raise TypeError(
TypeError: Invalid first argument to `register()`: typing.Mapping. Use either `@register(some_class)` or plain `@register` on an annotated function.
Регистрация тарифов с аннотированной версией не лучше:
>>> @f.register
... def _(x: Mapping):
... return x
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/home/user/cpython/Lib/functools.py", line 842, in register
raise TypeError(
TypeError: Invalid annotation for 'x'. typing.Mapping is not a class.
Я неправильно использовал одну отправкуи дженерики раньше, и есть ли способ добиться эквивалентного поведения в версии 3.7 и выше?