Style question on recursive generators
Carlos Ribeiro
carribeiro at gmail.com
Mon Oct 18 10:57:54 EDT 2004
On Mon, 18 Oct 2004 16:27:43 +0200, Alex Martelli <aleaxit at yahoo.com> wrote:
> Carlos Ribeiro <carribeiro at gmail.com> wrote:
> ...
> > Yes, that's a good point, and it's one of the reasons I tend to prefer
> > the generator now. But anyway, it's just me, or does the 'chained
> > yield' look ugly to someone else? It may be just a question of getting
> > used to it, but nevertheless it's bugging me...
>
> I'm not sure why it should look ugly to you. What alternatives would
> you consider non-ugly for the common (in any generator) idiom:
> for x in y: yield x
> ?
>
> Perhaps some syntax hack such as a new statement keyword 'yieldall'
> where the above idiom could be expressed as
> yieldall y
> ? Or some other syntax hack such as 'yield<<y', or 'yield from y',
> ditto? Personally, it would seem to me that such special syntax would
> be just one more bit of Python to learn, without substantial benefits,
> but that's because I see nothing ugly in today's idiom -- it does just
> what it says, plainly and unpretentiously...
Generally speaking, new keywords hardly solve any problem; in fact,
they create new problems of their own :-) In this case, my main gripe
is that the code doesn't read as naturally as the simple recursive
version, because of the double for loop. Its also strange because I
often have to stop and think, "what am I yielding now". For deeply
nested recursive cases there is also the feeling that the yield chain
may prove to be a performance dog, but that's should not be the main
point here anyway.
I have a strange idea in the back of my mind that tells me that a
possible solution would be to have any of the nested yields to
immediately return the result to the original caller. In this case, I
would write my code this way:
def walk(self):
"""generator-based recursive tree traversal"""
yield child
for child in childs:
transfer child.walk()
It's quite weird -- a generator plus a direct flow-of-execution
transfer. It's not a goto, its not a co-routine... It requires a new
keyword ('transfer', in this case), which _is_ a real problem --
something like this can't be lightly proposed. In this case, it's just
a thought experiment, at this point; nothing serious, and far from a
proposal.
--
Carlos Ribeiro
Consultoria em Projetos
blog: http://rascunhosrotos.blogspot.com
blog: http://pythonnotes.blogspot.com
mail: carribeiro at gmail.com
mail: carribeiro at yahoo.com
More information about the Python-list
mailing list