История изменений
Исправление tailgunner, (текущая версия) :
Насколько я понимаю, конвейер из генераторов пишется в десяток строк.
Да. Только потом эти 10 строк придется везде копипастить, т.к функцией его сделать нельзя
Хм. Чем не подходит такая функция?
def pipeline(glst):
def prime(x):
if isinstance(x, FunctionType):
pass
elif isinstance(x, GeneratorType):
g.next()
def run(x, v):
if isinstance(x, FunctionType):
if x.func_code.co_argcount > 1 and isinstance(v, tuple):
return x(*v)
else:
return x(v)
elif isinstance(x, GeneratorType):
v = g.send(v)
g.next()
return v
else:
assert False
hd, tl = glst[0], glst[1:]
assert isinstance(hd, GeneratorType)
for g in tl:
prime(g)
while True:
v = hd.next()
for g in tl:
v = run(g, v)
yield v
Умеет сшивать функции и генераторы; если надо сшивать только генераторы, будет короче.
Исходная версия tailgunner, :
Насколько я понимаю, конвейер из генераторов пишется в десяток строк.
Да. Только потом эти 10 строк придется везде копипастить, т.к функцией его сделать нельзя
Хм. Чем не подходит такая функция?
def pipeline(glst):
def prime(x):
if isinstance(x, FunctionType):
pass
elif isinstance(x, GeneratorType):
g.next()
def run(x, v):
if isinstance(x, FunctionType):
if x.func_code.co_argcount > 1 and isinstance(v, tuple):
return x(*v)
else:
return x(v)
elif isinstance(x, GeneratorType):
v = g.send(v)
g.next()
return v
else:
assert False
hd, tl = glst[0], glst[1:]
assert isinstance(hd, GeneratorType)
for g in tl:
prime(g)
while True:
v = hd.next()
for g in tl:
v = run(g, v)
yield v
Умеет сшивать функции и генераторы; если надо сшивать только генераторы, будет короче.