设计Python API:流式接口还是参数
我正在尝试把一个简单的 Protovis 接口移植到Python中。
我们来看一个简单的柱状图例子,用的是Javascript:
var vis = new pv.Panel()
.width(150)
.height(150);
vis.add(pv.Bar)
.data([1, 1.2, 1.7, 1.5, .7, .3])
.width(20)
.height(function(d) d * 80)
.bottom(0)
.left(function() this.index * 25);
vis.render();
我在考虑是继续使用这种流畅的接口风格,还是改用命名参数。用命名参数的话,我们可以这样写:
vis = pv.Panel(width=150,
height=150)
vis = vis + pv.Bar(data=[1, 1.2],
width=20,
height=lambda d: d * 80,
bottom=0,
left=lambda: self.index * 25)
vis.render()
在Python中有没有更好的风格呢?
1 个回答
20
我支持使用命名参数,不支持链式调用。
链式调用会让代码的智能提示变得很差,因为你看到的只是一个空的 Panel() 或 Bar()。当然,你可以查看文档,但现在大多数开发环境都有智能提示功能,这能大大提高工作效率。
链式调用让程序中调用类变得更加复杂。能够像 *args 和 **kwargs 这样传入列表或字典是很方便的——虽然链式调用也能做到,但你基本上得同时支持这两种方法,或者做很多复杂的操作来动态创建类。
链式调用让代码更难阅读,因为总会有人把所有内容写在一行上,然后会发现传入同一个参数两次导致问题。虽然可以通过其他方式避免这种情况,但使用命名参数构造函数时,重复参数的过滤几乎是自动完成的。