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"


