You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 13:42:41