如何为可接受列表或单个值的参数添加类型提示?有无更优实践?
更优的类型提示实践方案
你的需求是让参数同时接受单个str/int/float值或这些值的列表,用Union确实可行,但有几种更简洁、可读性更强的优化方式:
1. 定义类型别名简化重复代码
先把重复的单个值类型抽成别名,再组合成最终的参数类型,避免冗余:
from typing import Union, List # 定义单个值的类型别名 NumberOrStr = Union[str, int, float] def my_method(self, ex_param: Union[List[NumberOrStr], NumberOrStr]): pass
2. 用Python 3.10+的管道运算符|替代Union
Python 3.10及以上支持用|代替Union,语法更简洁直观:
from typing import List # 类型别名也用管道语法 NumberOrStr = str | int | float def my_method(self, ex_param: List[NumberOrStr] | NumberOrStr): pass
3. 用Sequence替代List提升灵活性
如果你的函数逻辑不严格要求参数是列表(比如也能处理元组等序列类型),可以用typing.Sequence代替List,让类型提示更通用:
from typing import Sequence NumberOrStr = str | int | float def my_method(self, ex_param: Sequence[NumberOrStr] | NumberOrStr): pass
额外建议:函数内部统一处理逻辑
通常这种场景下,函数内部会把单个值转换成列表来统一处理,你可以在函数开头加一段转换逻辑,配合类型提示让代码更健壮:
from typing import Sequence, List NumberOrStr = str | int | float def my_method(self, ex_param: Sequence[NumberOrStr] | NumberOrStr) -> None: # 将单个值转为列表,统一后续处理逻辑 param_list: List[NumberOrStr] = [ex_param] if isinstance(ex_param, (str, int, float)) else list(ex_param) # 后续用param_list处理业务逻辑 pass
内容的提问来源于stack exchange,提问作者intransigent_rocker
相关产品推荐
相关产品推荐

