如果我开始返回更多数据,则返回可解包值的可迭代值,这些值不会破坏客户端代码
作者:互联网
假设你正在编写一个你打算公开的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