Como mapear ou aninhar geradores de função Python 2.7?
Se eu tiver um gerador de funções muito simples (embora possivelmente muito complexo) no Python 2.7, assim:
def accumulator():
x = yield 0
while True:
x += yield x
Que pode ser usado, assim:
>>> a = accumulator()
>>> a.send(None)
0
>>> a.send(1)
1
>>> a.send(2)
3
>>> a.send(3)
6
O que seria um invólucro simples para outro gerador de função que produz o mesmo resultado, exceto multiplicado por 2? O gerador de funções acima é simples, mas suponha que seja muito complicado copiar e colar. Estou tentando algo como:
def doubler():
a = accumulator()
a.send(None)
y = yield 0
while True:
y = 2 * a.send(yield y)
Ou, imaginando algo mais simples:
def doubler():
a = accumulator()
a.send = lambda v: 2 * super(self).send(v)
return a
Ambos estão terrivelmente quebrados, então não compartilharei os erros de sintaxe, mas isso pode ilustrar o que estou tentando fazer.
Idealmente, eu gostaria de obter algo como:
>>> d = doubler()
>>> d.send(None)
0
>>> d.send(1)
2
>>> d.send(2)
6
>>> d.send(3)
12
Os resultados são exatamente os mesmos que o original, exceto o dobro.
Estou tentando evitar duplicar um gerador de funções muito complicado para criar um resultado idêntico, exceto dimensionado por um fator conhecido.
O segundo gerador terá um fluxo de entrada diferente, portanto, não posso apenas usar o resultado do primeiro gerador e duplicá-lo. Preciso de um segundo gerador independente, envolvendo o primeiro.
O fluxo de entrada é indeterminado, de modo que é impossível gerar a sequência inteira e depois transformar.
Parece que eu quero mapear ou aninhar esses geradores de função, mas não tenho certeza do jargão apropriado e, portanto, não estou chegando a lugar algum no Google.