typing模块(或任何其他模块)是否展示了API以在运行时对变量进行类型检查,类似于isinstance(),但了解typing中定义的类型类?

我想做一些类似的事情:

from typing import List
assert isinstance([1, 'bob'], List[int]), 'Wrong type'

最佳答案

typing模块中没有这样的功能,很可能永远不会有。

检查对象是否是类的实例(仅表示“该对象是由类的构造函数创建的”),是测试某些标记的简单问题。

但是,不一定要确定对象是否为类型的“实例”:

assert isinstance(foo, Callable[[int], str]), 'Wrong type'

尽管很容易检查foo的类型化注释(假设它不是lambda),但是根据赖斯定理,检查它是否符合它们通常是不确定的。

即使使用更简单的类型(例如List[int]),测试也很容易变得效率低下,无法用于最小的玩具示例。
xs = set(range(10000))
xs.add("a")
xs.pop()
assert isinstance(xs, Set[int]), 'Wrong type'

允许类型检查器以相对有效的方式执行此操作的技巧是保守的:类型检查器试图证明foo始终返回int。如果失败,即使程序可能是有效的,它也会拒绝该程序,即尽管此功能非常安全,但很可能会拒绝该功能:
def foo() -> int:
    if "a".startswith("a"):
        return 1
    return "x"

关于python - Python> = 3.5 : Checking type annotation at runtime,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43646823/

10-12 18:21