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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:10:36