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
相关产品推荐
相关产品推荐

