如何以Pythonic方式为Either[ErrorT, ValueT]类型添加类型注解?
Python函数抛出指定异常时的类型注解方案
首先明确:Python的标准类型注解体系(包括typing和typing-extensions)没有直接支持标注函数可能抛出的具体异常类型,这是设计层面的选择——类型系统聚焦于静态可验证的输入/输出类型,异常属于运行时行为范畴。
针对你的场景,这里有几种实用的处理方案:
1. 标准常规方案:标注正常返回类型 + 文档说明异常
这是Python社区的通用做法,类型注解只标注函数正常执行时的返回类型,同时在docstring中明确说明可能抛出的异常类型。类型检查器(如mypy)会自动识别抛出异常的分支不会返回,因此不会报错。
示例代码:
from typing import Any def could_fail_on_bad_input(value: Any) -> ValidType: """转换符合要求的输入值 参数: value: 待转换的输入,必须是ValidType的实例 抛出: TypeError: 当输入不是ValidType类型时触发 返回: 转换后的ValidType实例 """ if isinstance(value, ValidType): # 转换逻辑 return transformed_value else: raise TypeError("Unsupported type")
2. 用Annotated添加异常元数据(非强制检查)
如果你希望在类型层面留下异常提示(尽管无法被类型检查器验证),可以使用typing.Annotated为返回类型附加自定义元数据,用于说明可能抛出的异常。这只是增强可读性的手段,不会影响类型检查逻辑。
示例代码:
from typing import Any, Annotated def could_fail_on_bad_input(value: Any) -> Annotated[ValidType, "可能抛出TypeError"]: if isinstance(value, ValidType): # 转换逻辑 return transformed_value else: raise TypeError("Unsupported type")
关于你提到的Union[NoReturn, ValidType]
这个写法本身是合法的,但属于冗余操作:类型检查器会自动识别抛出异常的分支属于"不返回"路径,因此直接标注-> ValidType就足够了。NoReturn在这里的语义是"该分支不会正常返回",而非"函数完全不返回",但单独使用它并不能指定具体异常类型,所以对你的需求来说没有额外价值。
内容的提问来源于stack exchange,提问作者Alexandru Burlacu
相关产品推荐
相关产品推荐

