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/