J
John O'Hagan
I have a generator function which takes as arguments another generator and a
dictionary of other generators like this:
def modgen(gen, gendict):
for item in gen():
for k, v in gendict:
do_something_called_k(item, v.next())
yield item
I want to control the output of this generator by sending in new values to the
generators in gendict. I have done this using a list in a simple generator
like:
def loop(lis):
while True:
for item in lis:
yield item
and write:
lis[:] = [new_value]
to see the output of modgen() change.
However, I want to be able to use other modgen() instances as values in
gendict, each with a gendict of its own, which in turn may contain modgen()
instances, and so on recursively. The recursion stops wherever a simple
generator like loop() is encountered.
To this end I've made nested dictionaries like this example:
{'a':[1,2,3], 'b':{'a':[4,5,6]}, 'c':{'a':{'a':[7,8,9], 'b':{'c':[10]}}}}
and used a recursive function to convert them to the gendict I'm after like
this:
def iterized(dic):
itdic = {}
for k, v in dic.items():
if isinstance(v, dict):
itval = iterized(v)
itdic[k] = maingen(itval)
else:
itdic[k] = loop(v)
return itdic
Then I can write:
recdic = {nested:dictionary}
gendict = iterized(recdict)
mygen = modgen(gen, gendict)
The problem is that the gendict looks like this:
{'a': <generator object loop at 0x8841414>, 'b': <generator object modgen at
0x8841464>, 'c': <generator object modgen at 0x884148c>}
so I have no direct access from there to the sub-generators.
I have tried using a deep update function on the original nested dictionary,
but this only works if I change the contents of a list, not if I want to,
say, change a node from a list to a dictionary or vice versa, because in that
case I'm not operating on the same object the generator is using.
If anyone's still reading , how can I send new values to arbitrary sub-
generators?
Thanks,
john
dictionary of other generators like this:
def modgen(gen, gendict):
for item in gen():
for k, v in gendict:
do_something_called_k(item, v.next())
yield item
I want to control the output of this generator by sending in new values to the
generators in gendict. I have done this using a list in a simple generator
like:
def loop(lis):
while True:
for item in lis:
yield item
and write:
lis[:] = [new_value]
to see the output of modgen() change.
However, I want to be able to use other modgen() instances as values in
gendict, each with a gendict of its own, which in turn may contain modgen()
instances, and so on recursively. The recursion stops wherever a simple
generator like loop() is encountered.
To this end I've made nested dictionaries like this example:
{'a':[1,2,3], 'b':{'a':[4,5,6]}, 'c':{'a':{'a':[7,8,9], 'b':{'c':[10]}}}}
and used a recursive function to convert them to the gendict I'm after like
this:
def iterized(dic):
itdic = {}
for k, v in dic.items():
if isinstance(v, dict):
itval = iterized(v)
itdic[k] = maingen(itval)
else:
itdic[k] = loop(v)
return itdic
Then I can write:
recdic = {nested:dictionary}
gendict = iterized(recdict)
mygen = modgen(gen, gendict)
The problem is that the gendict looks like this:
{'a': <generator object loop at 0x8841414>, 'b': <generator object modgen at
0x8841464>, 'c': <generator object modgen at 0x884148c>}
so I have no direct access from there to the sub-generators.
I have tried using a deep update function on the original nested dictionary,
but this only works if I change the contents of a list, not if I want to,
say, change a node from a list to a dictionary or vice versa, because in that
case I'm not operating on the same object the generator is using.
If anyone's still reading , how can I send new values to arbitrary sub-
generators?
Thanks,
john