为什么isinstance([1,2,3],List [str])评估为true?

时间:2015-09-25 19:45:51

标签: python python-3.5

我正在使用python3.5的新类型提示/输入模块玩一下,试图找到一种方法来确认提示类型是否等于变量的实际类型并且遇到了令我感到惊讶的事情。

>>> from typing import List
>>> someList = [1, 2, 3]
>>> isinstance(someList, List[str])
True

继续寻找一种方法来比较一个变量与它的暗示类型我也试过这个:

>>> anotherList = ["foo", "bar"]
>>> type(anotherList) is List[str]
False

是否有人能够解释为什么前者评估为True?

继续向前,有没有一种方法可以检查变量的类型是否等于来自输入模块的类型?

1 个答案:

答案 0 :(得分:4)

isinstance不进行真正的PEP 484类型检查。 The documentation顺便注意到这一点:

  

通常,isinstance()issubclass()不应与类型一起使用。

typing模块以及它所基于的collections.abcabc模块使用广泛的__instancecheck__ and __subclasscheck__魔法来制作isinstance和{{1行为合理。但他们没有做足以支持你的案子。他们的目标也不是支持它。

  

有没有一种方法来检查变量的类型是否等于来自输入模块的类型?

您不是在寻找类型相等。正如您已经注意到的那样,issubclass的类型为[1, 2, 3]等于listList[str]。你正在寻找类型检查,这要复杂得多。

考虑一下:

List[int]

您希望此程序打印什么?您不能指望def my_function(): # ... 1000 lines of very complicated code ... print(isinstance(my_function, Callable[[], int])) 在运行时挖掘isinstance并推断它始终返回my_function。这在Python中是不可行的。您需要一个可以访问int结构的“编译”时间类型检查器,或者显式类型注释,或者最有可能两者。