9

我正在尝试使用 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

继续前进,是否有一种可靠的方法来检查变量的类型是否等于来自类型模块的类型?

4

1 回答 1

6

isinstance不做真正的PEP 484类型检查。文档顺便指出了这一点:

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

typing模块,以及它所基于的模块,使用广泛collections.abc魔法来合理地制作和运行。但他们没有做足够的事情来支持你的案子。支持它也不是他们的目标。abc__instancecheck____subclasscheck__isinstanceissubclass

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

你不是在寻找类型相等。正如您自己注意到的那样,[1, 2, 3]is的类型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或显式类型注释,或者——很可能——两者兼而有之。

于 2015-09-26T00:30:11.700 回答