在我从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中进行?
这是有意的,你不应该把类型与typing
中定义的类型混合,至少,这是我所理解的它的要点。关于这方面的大量讨论包含在问题#136 Kill __subclasscheck__
中,该问题也引入了这一变化。 commit message还引用了isinstance
/ subclass
检查将如何提高TypeError
s:
使用
isinstance()
或issubclass()
几乎可以提升TypeError
。有例外:[...]
您可以在不指定泛型类型的包含类型的情况下进行比较,即:
isinstance(list, typing.List[int])
但那是你能做的最好的事情。
如果你想在python中拥有更好的类型安全性,你的选择有些限制。我使用的一种技术是子类列表或字典而不覆盖任何属性,方法等。
class ListInts(list):
pass
new_obj = ListInts()
new_obj += [1, 2, 3, 4, 5, 6]
print(isinstance(new_obj, ListInts)