isinstance()
模块(或任何其他模块)是否展示了一个API来在运行时对变量进行类型检查,类似于typing
但是要理解from typing import List
assert isinstance([1, 'bob'], List[int]), 'Wrong type'
中定义的类型类?
我想做一些类似于:
的事情a = np.zeros(N+1)
for number in get_numbers():
a[number] += 1
答案 0 :(得分:8)
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"
答案 1 :(得分:2)
我正在寻找类似的东西,并找到了typeguard库。这可以在任何位置自动进行运行时类型检查。还支持直接在问题中检查类型。在文档中,
from typeguard import check_type
# Raises TypeError if there's a problem
check_type('variablename', [1234], List[int])
答案 2 :(得分:0)
库 Pyadaaah 提供自动的运行时类型和范围检查,以及类属性的信号。
例如从以下内容开始查看属于的youtube视频(系列):https://www.youtube.com/watch?v=Y3Hmg_HQtsY
顺便说一下,这也是(基础)属性/获取器/设置器机制的很好介绍。
Pyadaaah并未使用类型库。