返回iterable的可解压值,如果我开始返回更多的数据,这些值不会破坏客户端代码

2024-04-28 09:13:35 发布

您现在位置:Python中文网/ 问答频道 /正文

假设您正在编写一个要公开的API。API中的函数quux返回一个列表或元组生成器,例如yield (foo, bar)。在

客户端代码通常会这样使用它:

for foo, bar in quux(whatever):
    # do stuff with foo and bar

现在,假设将来您可能希望开始返回baz和{}和{}。你不想现在就把它还回去,因为雅尼在没有其他证据之前。在

什么是最好的方法来(尝试)确保未来的更改不会破坏客户端代码?在

我知道Python3允许人们做类似for foo, bar, *idontcare in quux(whatever)的事情,而在Python2中,人们总是可以编写一个实用函数(要像这样使用for foo, bar in iterleft(quux(whatever), 2)):

^{pr2}$

但我想知道有没有更好的方法来做这样的事情。在


Tags: 方法函数代码inapi客户端列表for
2条回答

问题是您有语义数据(“元组的第一个元素意味着x,第二个元素意味着y,…”),而这些数据并没有与数据一起传递。在

解决此问题的一种通用方法是返回参数的字典{"foo": foo, "bar": bar, ...}。当然,那么就不能使用元组解包。在

否则,为了保持向后兼容性,您不能更改quux。相反,您可以编写quux_with_bar,生成(foo, bar, baz)元组,然后使{}只过滤其中的前两个元素。在

返回一个^{}而不是一个普通的元组,您不需要解包它。然后,您可以在以后扩展返回的元组,而不会影响API的现有用户:

from collections import namedtuple

QuuxReturnValue = namedtuple('QuuxReturnValue', ('foo', 'bar'))

def quux(*args, **kw):
    while True:
        yield QuuxReturnValue(foo='foo', bar='bar')

您的API的使用方式如下:

^{pr2}$

如果稍后更新namedtuple以添加第三个参数'baz',则上述使用者仍然可以工作。在

相关问题 更多 >