升级到3.7版后,我使用了functools.singledispatch
和functools.singledispatch
中断的功能。在3.6中曾经使用过的方法:
generics
现在加薪
>>> 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.
我以前是否曾经滥用过单个调度和泛型,并且有没有办法在3.7版及更高版本中实现等效的行为?
您需要>>> @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.
。通用类大多与任何类型的运行时检查都不兼容。
几乎没有兼容性的情况大部分没有记录,并且经常更改。例如,collections.abc.Mapping
曾经是一个类,而文档仍然say仍然是一个类,但实际上只是假装现在是一个类。 typing.Mapping
需要一个真实的班级。