在参数化泛型中,isinstance和issubclass中的mypy差异从python 3.5到3.6

der*_*ers 6 python typing type-hinting python-3.x mypy

在我从python 3.5升级到python 3.6之前,这个工作:

import typing
issubclass(list, typing.List[int])  # returns True
isinstance([1, 2 ,3], typing.List[int]) # returns True
Run Code Online (Sandbox Code Playgroud)

现在在python 3.6中,这两个都引发了以下异常:

TypeError: Parameterized generics cannot be used with class or instance checks
Run Code Online (Sandbox Code Playgroud)

这是新的预期行为还是错误?如果打算如何执行检查,上面的代码在python 3.6中进行?

Jim*_*ard 4

这是故意的,您不应该将类与中定义的类型混合在一起typing,至少,这是我所理解的要点。对此进行了大量讨论的问题#136 Kill __subclasscheck__也引入了此更改。提交消息还引用了isinstance/subclass检查将如何引发TypeErrors:

几乎所有事情都可以使用isinstance()issubclass()加注。TypeError但也有例外:[...]

可以在不指定泛型类型包含的类型的情况下进行比较,即:

isinstance(list, typing.List[int])
Run Code Online (Sandbox Code Playgroud)

但这是你能做的最好的事情。

  • 顺便说一句,“isinstance(list, Typing.List[int])”仍然会引发 TypeError (4认同)
  • 哇...如何让一种语言变得不那么有用/ (3认同)