我正在使用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?
继续向前,有没有一种方法可以检查变量的类型是否等于来自输入模块的类型?
答案 0 :(得分:4)
isinstance
不进行真正的PEP 484类型检查。 The documentation顺便注意到这一点:
通常,
isinstance()
和issubclass()
不应与类型一起使用。
typing
模块以及它所基于的collections.abc
和abc
模块使用广泛的__instancecheck__
and __subclasscheck__
魔法来制作isinstance
和{{1行为合理。但他们没有做足以支持你的案子。他们的目标也不是支持它。
有没有一种方法来检查变量的类型是否等于来自输入模块的类型?
您不是在寻找类型相等。正如您已经注意到的那样,issubclass
的类型为[1, 2, 3]
,等于至list
,List[str]
。你正在寻找类型检查,这要复杂得多。
考虑一下:
List[int]
您希望此程序打印什么?您不能指望def my_function():
# ... 1000 lines of very complicated code ...
print(isinstance(my_function, Callable[[], int]))
在运行时挖掘isinstance
并推断它始终返回my_function
。这在Python中是不可行的。您需要一个可以访问int
结构的“编译”时间类型检查器,或者显式类型注释,或者最有可能两者。