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

如何为含布尔参数的Python函数标注条件化返回类型?

根据布尔参数推导返回类型的解决方案

你可以通过typing.overload为函数定义多个类型签名,让类型检查器(如mypy、pyright)根据传入的布尔字面量,自动识别对应的返回类型。

方法一:结合Literal使用重载

这种方式最直观,明确指定布尔参数的字面量值对应的返回类型:

from typing import overload, Union, Literal

# 为ret_str=True的情况定义类型签名
@overload
def fn(x: int, ret_str: Literal[True]) -> str:
    ...

# 为ret_str=False的情况定义类型签名
@overload
def fn(x: int, ret_str: Literal[False]) -> int:
    ...

# 函数实际实现,返回类型用Union覆盖所有情况
def fn(x: int, ret_str: bool) -> Union[int, str]:
    if ret_str:
        return str(x)
    else:
        return x

调用时,类型检查器会正确推导返回类型:

out_int = fn(8, ret_str=False)  # 类型检查器识别为int
out_str = fn(8, ret_str=True)   # 类型检查器识别为str

方法二:直接通过重载指定参数值

如果不需要显式用Literal,也可以直接在重载签名里指定布尔参数的取值:

from typing import overload, Union

@overload
def fn(x: int, ret_str: bool = True) -> str:
    ...

@overload
def fn(x: int, ret_str: bool = False) -> int:
    ...

def fn(x: int, ret_str: bool) -> Union[int, str]:
    if ret_str:
        return str(x)
    else:
        return x

这种写法同样能让类型检查器根据传入的字面量True/False推导返回类型。

注意:@overload定义的签名仅用于类型检查,实际运行时不会执行,函数的逻辑依然由最后那个实际实现的函数体处理。如果使用Python 3.7及以下版本,需要安装typing_extensions库来导入Literal和overload。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:30:57