为什么isinstance([1,2,3],List [str])评估为true?
我使用python3.5的新类型提示/打字模块试图找到一种方法来确认提示类型是否等于变量的实际类型,并且遇到了令我感到吃惊的事情。
>>> from typing import List
>>> someList = [1, 2, 3]
>>> isinstance(someList, List[str])
True
继续我的搜索找到一种方法来比较一个变量,它是暗示类型我也试过这个:
>>> anotherList = ["foo", "bar"]
>>> type(anotherList) is List[str]
False
任何人都能够解释为什么前者评估为真?
并继续,有没有一种可行的方法来检查变量的类型是否等于来自打字模块的类型?
isinstance
不会执行真正的PEP 484类型检查。 该文件记录了这一点:
通常, isinstance()
和issubclass()
不应与类型一起使用。
typing
模块以及它所基于的collections.abc
和abc
模块使用广泛的__instancecheck__
和__subclasscheck__
魔术来使isinstance
和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
并推断它总是返回int
。 这在Python中不可行。 您需要一个可以访问my_function
结构的“编译”时间类型检查器,或者显式类型注释,或者最有可能的两个。
上一篇: Why does isinstance([1, 2, 3], List[str]) evaluate to true?
下一篇: SKVideoNode (embedded in SKScene) as texture for for Scene Kit Node not working