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

Voj*_*vic 3 python iterable-unpacking

假设你正在编写一个你打算公开的API.函数quux的API中返回一个列表或元组的发电机,例如yield (foo, bar).

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

for foo, bar in quux(whatever):
    # do stuff with foo and bar
Run Code Online (Sandbox Code Playgroud)

现在,假设将来你可能想和and baz一起开始回来.你现在不想退货,因为YAGNI直到证明不然.foobar

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

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

def iterleft(iterable, limit):
    for item in iterable:
        yield item[:limit]
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有更好的方法来做这样的事情.

Kat*_*iel 5

问题是你有语义数据("元组的第一个元素表示x,第二个元素表示y,......"),你没有传递数据.

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

否则,为了保持向后兼容性,您无法更改quux.相反,你可以编写quux_with_bar产生(foo, bar, baz)元组然后quux只过滤它的前两个元素.