Python >=3.5: 在运行时检查类型注解
Python >=3.5: Checking type annotation at runtime
typing
模块(或任何其他模块)是否展示了 API 以在 运行 时对变量进行类型检查,类似于 isinstance()
但了解类型 类 在 typing
?
中定义
我想 运行 类似于:
from typing import List
assert isinstance([1, 'bob'], List[int]), 'Wrong type'
typing
模块中没有这样的功能,很可能永远不会有。
检查对象是否是 class 的实例 - 这仅意味着 "this object was created by the class' constructor" - 是测试某些标记的简单问题。
然而,检查一个对象是否是一个 "instance" 类型不一定是可判定的:
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
总是 return int
。如果失败,它会拒绝该程序,即使该程序可能是有效的,即这个函数很可能会被拒绝,尽管它是完全安全的:
def foo() -> int:
if "a".startswith("a"):
return 1
return "x"
我正在寻找类似的东西并找到了图书馆 typeguard。这可以在任何你想要的地方自动进行运行时类型检查。还支持直接检查问题中的类型。从文档中,
from typeguard import check_type
# Raises TypeError if there's a problem
check_type('variablename', [1234], List[int])
这是我最近发现的,基本上这个装饰器会在运行时进行类型检查,如果某些类型定义不匹配则引发异常。它还可以对嵌套类型(字符串字典等)进行类型检查
https://github.com/FelixTheC/strongtyping
示例:
from strongtyping.strong_typing import match_typing
@match_typing
def func_a(a: str, b: int, c: list):
...
func_a('1', 2, [i for i in range(5)])
# >>> True
func_a(1, 2, [i for i in range(5)])
# >>> will raise a TypeMismatch Exception
typing
模块(或任何其他模块)是否展示了 API 以在 运行 时对变量进行类型检查,类似于 isinstance()
但了解类型 类 在 typing
?
我想 运行 类似于:
from typing import List
assert isinstance([1, 'bob'], List[int]), 'Wrong type'
typing
模块中没有这样的功能,很可能永远不会有。
检查对象是否是 class 的实例 - 这仅意味着 "this object was created by the class' constructor" - 是测试某些标记的简单问题。
然而,检查一个对象是否是一个 "instance" 类型不一定是可判定的:
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
总是 return int
。如果失败,它会拒绝该程序,即使该程序可能是有效的,即这个函数很可能会被拒绝,尽管它是完全安全的:
def foo() -> int:
if "a".startswith("a"):
return 1
return "x"
我正在寻找类似的东西并找到了图书馆 typeguard。这可以在任何你想要的地方自动进行运行时类型检查。还支持直接检查问题中的类型。从文档中,
from typeguard import check_type
# Raises TypeError if there's a problem
check_type('variablename', [1234], List[int])
这是我最近发现的,基本上这个装饰器会在运行时进行类型检查,如果某些类型定义不匹配则引发异常。它还可以对嵌套类型(字符串字典等)进行类型检查
https://github.com/FelixTheC/strongtyping
示例:
from strongtyping.strong_typing import match_typing
@match_typing
def func_a(a: str, b: int, c: list):
...
func_a('1', 2, [i for i in range(5)])
# >>> True
func_a(1, 2, [i for i in range(5)])
# >>> will raise a TypeMismatch Exception