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

问题描述 投票:6回答:2

在我从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中进行?

python python-3.x type-hinting typing mypy
2个回答
4
投票

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

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

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

isinstance(list, typing.List[int])

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


0
投票

如果你想在python中拥有更好的类型安全性,你的选择有些限制。我使用的一种技术是子类列表或字典而不覆盖任何属性,方法等。

class ListInts(list):
    pass

new_obj = ListInts()
new_obj += [1, 2, 3, 4, 5, 6]
print(isinstance(new_obj, ListInts)
© www.soinside.com 2019 - 2024. All rights reserved.