Python中能否复用其他函数类型信息为返回类型?如何标注sum_two返回类型?
当然可以!你完全不用靠@overload去枚举几十种可能的加法组合——Python的类型提示系统(配合mypy、pyright这类主流类型检查器)支持直接引用类型的__add__方法返回类型来标注sum_two的返回值,非常灵活。
下面是两种实用的解决方案:
1. 直接引用__add__的返回类型(Python 3.9+)
这是最简洁的写法,直接用T.__add__[S]来表示first + second的结果类型。这里的T.__add__[S]本质上是告诉类型检查器:取T类型的__add__方法,传入S类型参数后的返回类型。
from typing import TypeVar T = TypeVar('T') S = TypeVar('S') def sum_two(first: T, second: S) -> T.__add__[S]: return first + second
比如你调用sum_two(1, 2.5),类型检查器会自动推断返回类型为float;调用sum_two("foo", "bar")则返回str,完全匹配对应类型__add__方法的标注。
2. 用Protocol显式约束加法支持
如果你想更明确地要求参数必须实现合法的加法操作,可以定义一个Protocol来描述支持__add__的类型,同时关联输入和返回类型:
from typing import TypeVar, Protocol # 定义一个协议:支持接收T类型参数的__add__,返回R类型 T = TypeVar('T') R = TypeVar('R') class SupportsAdd(Protocol[T, R]): def __add__(self, other: T) -> R: ... # 现在定义sum_two,约束first必须符合SupportsAdd协议 S = TypeVar('S') def sum_two(first: SupportsAdd[S, R], second: S) -> R: return first + second
这种写法的好处是,如果你传入不支持加法的参数(比如sum_two({}, [])),类型检查器会直接抛出错误,提前帮你避免问题。
验证类型推断
你可以用reveal_type来测试类型检查器的推断是否正确:
reveal_type(sum_two(3, 4)) # 输出 "int" reveal_type(sum_two("a", "b")) # 输出 "str" reveal_type(sum_two([1], [2])) # 输出 "list[int]" reveal_type(sum_two(5, 3.14)) # 输出 "float"
只要你传入的参数的__add__方法有正确的类型标注,这些推断结果都会准确无误。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

