Есть ли ошибка в Collections.abc.Callable в Python 3.9.1?Python

Программы на Python
Anonymous
Есть ли ошибка в Collections.abc.Callable в Python 3.9.1?

Сообщение Anonymous »

Python 3.9 включает PEP 585 и отказывается от поддержки многих типов в модуле typing в пользу типов из Collections.abc, поскольку теперь они поддерживают __class_getitem__. Так обстоит дело, например, с Callable. Мне казалось, что typing.Callable и Collections.abc.Callable всегда должны вести себя одинаково, но это не так.
Этот простой пример приводит к ошибка:

Код: Выделить всё

>>> from typing import Optional
>>> from collections.abc import Callable
>>> def foo(arg: Optional[Callable[[int], int]]) -> None:
...    pass
...
Traceback (most recent call last):
File "", line 1, in 
File "/usr/local/lib/python3.9/typing.py", line 262, in inner
return func(*args, **kwds)
File "/usr/local/lib/python3.9/typing.py", line 339, in __getitem__
return self._getitem(self, parameters)
File "/usr/local/lib/python3.9/typing.py", line 463, in Optional
return Union[arg, type(None)]
File "/usr/local/lib/python3.9/typing.py", line 262, in inner
return func(*args, **kwds)
File "/usr/local/lib/python3.9/typing.py", line 339, in __getitem__
return self._getitem(self, parameters)
File "/usr/local/lib/python3.9/typing.py", line 451, in Union
parameters = _remove_dups_flatten(parameters)
File "/usr/local/lib/python3.9/typing.py", line 231, in _remove_dups_flatten
return tuple(_deduplicate(params))
File "/usr/local/lib/python3.9/typing.py", line 205, in _deduplicate
all_params = set(params)
TypeError: unhashable type: 'list'
но та же ошибка не возникает при вводе.Callable:

Код: Выделить всё

>>> from typing import Callable
>>> def foo(arg: Optional[Callable[[int], int]]) -> None:
...    pass
...
>>> # no error
Ошибки также не возникнет, если подпись немного упростить:

Код: Выделить всё

>>> from collections.abc import Callable
>>> def foo(arg: Optional[Callable[..., int]]) -> None:
...    pass
...
>>> # no error
>>> def foo(arg: Callable[[int], int]) -> None:
...    pass
...
>>> # no error
Это ошибка в Python 3.9 и 3.9.1?

Подробнее здесь: https://stackoverflow.com/questions/658 ... thon-3-9-1

Вернуться в «Python»