7

在我从 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 中执行的检查?

4

2 回答 2

4

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

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

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

isinstance(list, typing.List[int])

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

于 2017-02-03T17:52:07.963 回答
0

如果您想在 python 中获得更好的类型安全性,您的选择会受到一定限制。我采用的一种技术是在不覆盖任何属性、方法等的情况下对listdict进行子类化。

class ListInts(list):
    pass

new_obj = ListInts()
new_obj += [1, 2, 3, 4, 5, 6]
print(isinstance(new_obj, ListInts)
于 2018-09-18T14:39:45.993 回答