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)
但我想知道是否有更好的方法来做这样的事情.
问题是你有语义数据("元组的第一个元素表示x,第二个元素表示y,......"),你没有传递数据.
解决此问题的一般方法是返回{"foo": foo, "bar": bar, ...}参数字典.当然,那么你不能使用元组解包.
否则,为了保持向后兼容性,您无法更改quux.相反,你可以编写quux_with_bar产生(foo, bar, baz)元组然后quux只过滤它的前两个元素.
| 归档时间: |
|
| 查看次数: |
181 次 |
| 最近记录: |