假设您正在编写一个要公开的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)
):
但我想知道有没有更好的方法来做这样的事情。在
问题是您有语义数据(“元组的第一个元素意味着x,第二个元素意味着y,…”),而这些数据并没有与数据一起传递。在
解决此问题的一种通用方法是返回参数的字典
{"foo": foo, "bar": bar, ...}
。当然,那么就不能使用元组解包。在否则,为了保持向后兼容性,您不能更改}只过滤其中的前两个元素。在
quux
。相反,您可以编写quux_with_bar
,生成(foo, bar, baz)
元组,然后使{返回一个^{} 而不是一个普通的元组,您不需要解包它。然后,您可以在以后扩展返回的元组,而不会影响API的现有用户:
您的API的使用方式如下:
^{pr2}$如果稍后更新
namedtuple
以添加第三个参数'baz'
,则上述使用者仍然可以工作。在相关问题 更多 >
编程相关推荐