如何约束Union类型保证输入输出类型匹配,解决mypy类型不兼容报错
问题原因
mypy只能读取第三方foreign函数声明的返回类型为Union[str, Path],无法推导该函数实际「返回值与入参类型完全一致」的行为,因此会判定联合类型和my_func预期的单一泛型返回值不匹配。
解决方案
方案1:用typing.cast强制类型转换(改动最小)
直接对foreign的返回值做类型断言,仅影响mypy检查逻辑,不会改变实际运行行为:
def my_func(filename: T) -> T: return tp.cast(T, foreign(filename))
该方案适合仅在少数位置调用foreign的场景,修改成本极低。
方案2:给foreign函数加重载声明(更规范)
如果你的代码里多处调用foreign,可以在你可控制的代码范围内补充foreign的重载声明,明确告诉mypy该函数的类型映射规则,不需要修改第三方原有代码:
# 放在你自己的代码区、调用foreign之前的位置即可 @tp.overload def foreign(filename: str) -> str: ... @tp.overload def foreign(filename: pathlib.Path) -> pathlib.Path: ... # 后面的my_func代码不需要修改就可以通过mypy检查 def my_func(filename: T) -> T: return foreign(filename)
该方案更符合类型标注规范,后续所有调用foreign的位置都可以自动获得正确的类型推导,不需要单独加cast。
内容的提问来源于stack exchange,提问作者user3225309
相关产品推荐
相关产品推荐

