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