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.

questionAnswers(4)

yourAnswerToTheQuestion