typing
模块(或任何其他模块)是否展示了一个API来在运行时对变量进行类型检查,类似于 isinstance()
但理解 typing
中定义的类型类?
我想运行类似于:
from typing import List
assert isinstance([1, 'bob'], List[int]), 'Wrong type'
原文由 Bertrand Caron 发布,翻译遵循 CC BY-SA 4.0 许可协议
typing
模块(或任何其他模块)是否展示了一个API来在运行时对变量进行类型检查,类似于 isinstance()
但理解 typing
中定义的类型类?
我想运行类似于:
from typing import List
assert isinstance([1, 'bob'], List[int]), 'Wrong type'
原文由 Bertrand Caron 发布,翻译遵循 CC BY-SA 4.0 许可协议
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"
原文由 Elazar 发布,翻译遵循 CC BY-SA 3.0 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
我正在寻找类似的东西并找到了库 typeguard 。这可以在任何你想要的地方自动进行运行时类型检查。还支持直接检查问题中的类型。从文档中,