Python如何实现内联类型提示的运行时校验(兼容torchtyping场景)
方案1:使用typeguard内置的局部变量校验能力
typeguard 3.0及以上版本已经原生支持函数内局部变量的类型注解校验,只需要给@typechecked装饰器开启check_local_vars参数即可,完全符合你想要的隐式校验写法,不需要修改原有业务代码:
from typeguard import typechecked def makes_float_or_tuple(): # 模拟第三方返回值可能不符合预期的情况 return (1.0, 2.0) @typechecked(check_local_vars=True) def does_something_interesting(): x: float = makes_float_or_tuple() # 此处会自动校验类型,不匹配直接抛出TypeError print(x)
运行上述代码会直接抛出错误提示x的类型不符合float的预期,不需要手动加断言。
方案2:适配PyTorch张量形状校验的场景
你使用torchtyping的场景下,直接用torchtyping自带的@typechecked装饰器即可,它原生支持TensorType注解的运行时校验,默认包含局部变量的形状校验逻辑,完美匹配你的需求:
from torchtyping import TensorType, typechecked import torch @typechecked def interesting_reshaping_method(x: TensorType['batch', 'num_points', 'point_dim']): # 自动校验返回张量的形状是否匹配注解,写错dim/keepdim会立刻抛错,不会静默出错 lengths: TensorType['batch', 'num_points', 1] = torch.norm(x, dim=2, keepdim=True) # 后续业务逻辑
补充说明
- 性能方面:运行时类型校验会有少量性能损耗,你可以在调试/测试环境开启校验,生产环境通过设置环境变量
TYPEGUARD_DISABLE=1(typeguard)或者TORCHTYPING_DISABLE=1(torchtyping)全局关闭校验,完全不影响IDE的静态类型提示功能。 - 如果你确实想要自己实现类似装饰器,核心思路是通过AST解析目标函数的语法树,遍历所有带类型注解的赋值节点,在赋值语句后自动插入校验逻辑后重新编译函数即可,不过现有成熟库已经覆盖了绝大多数场景,不需要自行造轮子。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

