Python> = 3.5:在运行时检查类型注释

时间:2017-04-27 00:48:39

标签: python python-3.x type-hinting mypy

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

3 个答案:

答案 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并未使用类型库。