Sending to a generator being looped over in a for-loop

When giving some examples in a previous post, I gave this tree-traversing example: class Tree(object): def __init__(self, label, children=()): self.label = label self.children = children def __iter__(self): skip = yield self.label if skip == 'SKIP': yield 'SKIPPED' else: yield 'ENTER' for child in self.children: yield from child yield 'LEAVE' Here is a tree: tree = Tree('A', [Tree('B'), Tree('C')]) Here is an example of how to traverse it, avoiding the children of nodes called 'B'. I can't use a for-loop as I need to send the skip-value to the tree iterator and this makes the loop look quite complicated. Here's one way to do it: i = iter(tree) skip = None try: while True: a = i.send(skip) print a skip = 'SKIP' if a == 'B' else None except StopIteration: pass Now imagine that the 'continue' statement within a for-loop has an optional argument that is sent to the generator being looped over at the next iteration step. I would then be able to write the loop above much more simply: for a in tree: print a if a == 'B': continue 'SKIP' -- Arnaud

Ok, this is a good example (IMHO). So +1 from me. But I'm not sure about the syntax. Maybe "yield for child"? Arnaud Delobelle wrote:
When giving some examples in a previous post, I gave this tree-traversing example:
class Tree(object): def __init__(self, label, children=()): self.label = label self.children = children def __iter__(self): skip = yield self.label if skip == 'SKIP': yield 'SKIPPED' else: yield 'ENTER' for child in self.children: yield from child yield 'LEAVE'
Here is a tree:
tree = Tree('A', [Tree('B'), Tree('C')])
Here is an example of how to traverse it, avoiding the children of nodes called 'B'. I can't use a for-loop as I need to send the skip-value to the tree iterator and this makes the loop look quite complicated. Here's one way to do it:
i = iter(tree) skip = None try: while True: a = i.send(skip) print a skip = 'SKIP' if a == 'B' else None except StopIteration: pass
Now imagine that the 'continue' statement within a for-loop has an optional argument that is sent to the generator being looped over at the next iteration step. I would then be able to write the loop above much more simply:
for a in tree: print a if a == 'B': continue 'SKIP'
participants (2)
-
Arnaud Delobelle
-
Mathias Panzenböck