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

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

作者:互联网

假设你正在编写一个你打算公开的API. API中的函数quux返回一个列表或元组生成器,例如产量(foo,bar).

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

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

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

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

我知道Python 3允许人们在quux(无论如何)中执行诸如foo,bar,* idontcare之类的东西,而在Python 2中,总是可以编写一个实用函数(对于foo使用这样的东西,在iterleft中使用bar(quux(无论如何)) ,2)):

def iterleft(iterable, limit):
    for item in iterable:
        yield item[:limit]

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

解决方法:

返回namedtuple而不是常规元组,您不需要解压缩它.然后,您可以在不影响API的现有用户的情况下扩展返回的元组:

from collections import namedtuple

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

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

并且您的API被消耗如下:

for retval in quux():
    print retval.foo, retval.bar

如果你以后更新了namedtuple以添加第三个参数’baz’,那么上面的消费者仍然会工作.

标签:iterable-unpacking,python
来源: https://codeday.me/bug/20190723/1511220.html