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

如何为满足特定输出规则的Python函数添加正确类型注解?

正确的Python函数类型注解方案

针对你给出的函数,原Union写法无法精准约束输入输出的对应关系,要满足「输入int返回int、输入float返回float、输入str返回None」的规则,推荐两种方案:

方案一:使用函数重载(@overload)

这是最直观且类型检查器支持最好的方式,通过定义多个函数签名来明确不同输入对应的输出类型:

from typing import overload

# 定义三种输入输出的重载签名
@overload
def f(value: int) -> int:
    ...

@overload
def f(value: float) -> float:
    ...

@overload
def f(value: str) -> None:
    ...

# 函数本体实现
def f(value: int | float | str) -> int | float | None:
    if isinstance(value, str):
        return None
    return value

说明

  • 每个@overload装饰的函数只定义签名,用...代替实现
  • 类型检查器(如mypy、pyright)会根据传入参数的类型,匹配对应的重载签名,精准推断返回值类型
  • Python 3.10+支持用|替代Union,旧版本需改为Union[int, float, str]和Union[int, float, None]

方案二:使用TypeVar约束泛型类型

如果想通过泛型简化写法,可以定义一个限定为int/float的类型变量,结合Union实现:

from typing import TypeVar, Union

# 定义只能是int或float的类型变量T
T = TypeVar('T', int, float)

def f(value: Union[T, str]) -> Union[T, None]:
    if isinstance(value, str):
        return None
    return value

说明

  • 当传入int/float时,类型检查器会推断返回值与输入同类型;传入str时返回None
  • 这种写法更简洁,但重载方式对复杂场景的可读性更强

两种方案都能满足你的约束要求,优先推荐重载方案,因为它的类型对应关系更直观明确。

内容的提问来源于stack exchange,提问作者zyxue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 01:36:32