【发布时间】:2016-12-09 21:21:28
【问题描述】:
我正在使用 python 进行管道代码重构。
假设我们有一系列 generator 函数,我们希望将它们链接起来以形成一个数据处理管道。
例子:
#!/usr/bin/python
import itertools
def foo1(g):
for i in g:
yield i + 1
def foo2(g):
for i in g:
yield 10 + i
def foo3(g):
for i in g:
yield 'foo3:' + str(i)
res = foo3(foo2(foo1(range(0, 5))))
for i in res:
print i
输出:
foo3:11
foo3:12
foo3:13
foo3:14
foo3:15
我不认为foo3(foo2(foo1(range(0, 5)))) 是实现我的管道目标的pythonic 方式。尤其是当管道中的阶段数很大时。
我希望我可以像 jquery 中的链一样重写它。类似于:
range(0, 5).foo1().foo2().foo3()
或许
l = [range(0, 5), foo1, foo2, foo3]
res = runner.run(l)
但我是生成器主题的新手,找不到实现此目的的方法。
欢迎任何帮助。
【问题讨论】:
-
也许是itertools.accumulate 或functools.reduce? (两者都是标准库的一部分)
-
这听起来像是一些 XY 问题。如果您正在对数组/列表进行数字运算,请考虑使用 numpy/pandas。
-
maxymoo 的答案可能是最好的,但您也可以以不正当的方式滥用运算符重载(这在 Python 中是不受欢迎的),请参阅此以获得灵感:stackoverflow.com/questions/33658355/…