Pythonic风格的单/多输入输出类型适配最优实现方法
更Pythonic的字符串/列表输入输出适配方案
你的需求是让函数兼容单个字符串和字符串列表的输入输出,原代码不仅存在逻辑错误(判断条件写反),还可以进一步简化,以下是几种更符合Python风格的实现方式:
一、简化版:一行式输入输出处理
直接将输入转换和输出判断简化为单行表达式,让代码更紧凑:
from typing import Union, List def something_stringy(input: Union[str, List[str]]) -> Union[List[str], str]: # 将单个字符串转为列表,列表则直接使用 input_list = [input] if isinstance(input, str) else input output = another_function(input_list) # 输出长度为1时返回单个字符串,否则返回列表 return output[0] if len(output) == 1 else output
注意:原代码中if len(output) > 1: return output[0]是逻辑错误,会导致输出列表长度大于1时只返回第一个元素,这和你的需求完全相反,上面的代码已经修正了这个问题。
二、进阶版:用装饰器复用适配逻辑
如果有多个函数需要这种输入输出适配,使用装饰器可以将适配逻辑与业务逻辑解耦,更符合单一职责原则:
from typing import Union, List, Callable def str_list_adapter(func: Callable[[List[str]], List[str]]) -> Callable[[Union[str, List[str]]], Union[str, List[str]]]: def wrapper(input_data: Union[str, List[str]]) -> Union[str, List[str]]: # 统一处理输入 input_list = [input_data] if isinstance(input_data, str) else input_data # 调用原函数(原函数只需处理列表输入输出) output_list = func(input_list) # 统一处理输出 return output_list[0] if len(output_list) == 1 else output_list return wrapper
使用时,只需要给专注于列表处理的函数加上装饰器即可:
@str_list_adapter def something_stringy(input: List[str]) -> List[str]: # 这里只需要处理列表输入,无需关心单个字符串的情况 return another_function(input)
这种方式让业务函数更简洁,适配逻辑可以复用在多个函数上。
内容的提问来源于stack exchange,提问作者steadynappin
相关产品推荐
相关产品推荐

