可以在3.7及更高版本中与functools.singledispatch一起使用打字和映射吗?

问题描述 投票:0回答:1

升级到3.7版后,我使用了functools.singledispatchfunctools.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版及更高版本中实现等效的行为?

python python-3.7
1个回答
3
投票

您需要>>> @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需要一个真实的班级。

© www.soinside.com 2019 - 2024. All rights reserved.