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

Python:让函数返回与Optional输入同类型,有无更简洁实现?

如何让函数返回与Optional输入相同的类型?

问题场景

你编写了如下代码,尝试对可能为None的字符串做转大写处理,但静态检查器报错运算符+不支持str和str | None的组合:

import random
import typing


def get_maybe_str():
    return random.choice([" ", None])

def optional_upper(s: typing.Optional[str]):
    if s is None:
        return s
    return s.upper()


def example(foo:str):
    bar = get_maybe_str()
    if bar is None:
        return
    bar = optional_upper(bar)

    foobar = foo + bar

报错信息:

Operator "+" not supported for types "str" and "str | None" Operator "+" not supported for types "str" and "None" PylancereportOperatorIssue

你通过函数重载解决了问题,但觉得这种方式过于冗长,希望找到更简洁的实现方式。

简洁解决方案:使用TypeVar绑定输入输出类型

可以通过typing.TypeVar定义一个限定范围的类型变量,让函数的输入和输出类型严格对应,无需编写多重重载:

基础版本(兼容Python 3.9及以下)

import typing

# 定义类型变量,限定只能是str或None
T = typing.TypeVar("T", str, None)

def optional_upper(s: T) -> T:
    if s is None:
        return s
    return s.upper()

简化版本(Python 3.10+)

利用Python 3.10新增的|语法替代Optional,同时简化函数逻辑:

from typing import TypeVar

T = TypeVar("T", str, None)

def optional_upper(s: T) -> T:
    return s.upper() if s is not None else s

原理说明

TypeVar("T", str, None)限定了类型变量T只能取str或None两种类型。当你传入str类型的参数时,静态检查器会推断函数返回str;传入None时则返回None,完美匹配输入输出的类型关系,避免了重载的冗余代码。

这样修改后,example函数中经过if bar is None: return的判断后,bar会被推断为str类型,再经过optional_upper处理后依然是str,静态检查器就不会再报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:15:57