我有一个函数,当前返回两个值,一个int和一个string,例如:

def myfunc():
    return 0, 'stringA'

此函数已经在许多代码中使用,但我需要对其进行改进,以便它返回三个值,一个int和两个字符串,例如:

def myfunc():
    return 0, 'stringA', 'stringB'

当然,我希望保持与现有代码的兼容性,因此像上面修改的函数那样返回值将导致ValueError.

一种解决方案是将改进后的函数包装成另一个具有旧名称的函数,因此我们在现有代码中调用初始函数,在新代码中调用新函数,例如:

def newmyfunc():
    return 0, 'A', 'B'

def myfunc():
    result1, result2, _ = newmyfunc()
    return result1, result2

就这个解决方案而言,我觉得它并不优雅.

有没有更好的方法来实现这一目标?

推荐答案

首先,回答一个你没有问过的问题,但这可能对将来或其他人有所帮助:

当我发现我从一个函数返回多个项时,尤其是当返回的项列表开始增长时,我经常发现返回dict或对象而不是元组很有用.原因是,随着返回的项目列表的增长,跟踪哪个项目位于哪个索引变得更加困难.如果返回的项目组将单独使用,并且除了来自同一个函数之外,它们之间没有密切的关系,我更喜欢dict.如果返回的项目are在多个位置(例如用户名、密码、主机和端口)一起使用,请将它们全部包装在一个对象中(实例化一个自定义类),然后传递.YMMV,听起来你好像在试图避免重构代码,所以:

实际问题的最简单解决方案是向函数中添加关键字参数,设置该参数的默认值,并使用它来决定返回哪个版本的参数:

def myfunc(return_length=2):
    if return_length == 2:
        return 0, 'stringA'
    elif return_length == 3:
        return 0, 'stringA', 'stringB'
    else:
        raise ValueError(f'Unexpected number of return arguments {return_length}')

旧代码继续按原样调用函数,新代码显式调用my_func(return_length=3).当所有旧代码都被弃用时,可以将默认值更改为3和/或在设置为2时引发错误.

Python相关问答推荐

如何将带有逗号分隔的数字的字符串解析为int Array?

使用polars .滤镜进行切片速度比pandas .loc慢

Class_weight参数不影响RandomForestClassifier不平衡数据集中的结果

如何在具有重复数据的pandas中对groupby进行总和,同时保留其他列

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

如何制作10,000年及以后的日期时间对象?

使用groupby Pandas的一些操作

使用NeuralProphet绘制置信区间时出错

如何使regex代码只适用于空的目标单元格

matplotlib图中的复杂箭头形状

从旋转的DF查询非NaN值

计算空值

Polars map_使用多处理对UDF进行批处理

Pandas—MultiIndex Resample—我不想丢失其他索引的信息´

从一个df列提取单词,分配给另一个列

计算机找不到已安装的库'

使用np.fft.fft2和cv2.dft重现相位谱.为什么结果并不相似呢?

Django.core.exceptions.SynchronousOnlyOperation您不能从异步上下文中调用它-请使用线程或SYNC_TO_ASYNC

修改.pdb文件中的值并另存为新的