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

时间:2017-02-03 15:42:42

标签: python python-3.x type-hinting typing 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

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

TypeError: Parameterized generics cannot be used with class or instance checks

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

2 个答案:

答案 0 :(得分:4)

这是有意的,你不应该把类与typing中定义的类型混合起来,至少,这是我所理解的它的要点。关于这一点的大量讨论包含在问题#136 Kill __subclasscheck__中,该问题也引入了这一变化。 commit message还会引用isinstance / subclass检查将如何引发TypeError

  

使用isinstance()issubclass()可以为TypeError提升几乎所有内容。有例外:[...]

可以比较而不指定泛型类型的包含类型,即:

isinstance(list, typing.List[int])

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

答案 1 :(得分:0)

如果您希望在python中具有更好的类型安全性,则您的选择会受到一些限制。我采用的一种技术是在不覆盖任何属性,方法等的情况下将 list dict 子类化。

class ListInts(list):
    pass

new_obj = ListInts()
new_obj += [1, 2, 3, 4, 5, 6]
print(isinstance(new_obj, ListInts)