[Tutor] help with refactoring needed -- which approach is more Pythonic?

Brian van den Broek bvande at po-box.mcgill.ca
Thu Feb 10 01:52:18 CET 2005

Danny Yoo said unto the world upon 2005-02-09 19:06:
>>If we want to be fancy, we can also take advantage of Python's generator
>>support to avoid constructing an explicit list:
<SNIP code like that below but missing the .append()>
> Hi Brian,
> Oh good grief.  *grin*
> That last snippet won't work; I had forgotten about appending lines into
> current_node_contents.  Here's a revision of the silly code:
> ###
>     def partition_node_content(self, body_contents):
>         """Returns an iterator whose contents are a bunch of
>            node_content lists."""
>         current_node_contents = []
>         for line in body_contents:
>             current_node_contents.append(line)
>             if line == node_end_tag:
>                 yield current_node_contents
>                 current_node_contents = []
> ###
> I wanted to add that the generator approach should have the same
> performance characteristic as your original code.
> Your original code's approach interleaved the bundling of the body_content
> with calls to the node parser.  The approach with the separate list
> bundling behaves a little bit differently: it tries to build a list of all
> the node_content chunks, and then processes that list element by element.
> The generator approach, like your original code, interleaves the bundling
> with the node_content parsing.
> My apologies!

Hi Danny,

Apologies, while nice, aren't needed; catching your small thinko was 
the easy part of the generator code. :-) (Of the parts of Python about 
which I am still fuzzy, generators are among the fuzziest.) And thank 
you for the replies.

Given that in my application, neither performance nor memory use 
matter too much, are there are grounds (beyond bare personal 
preference) to choose amongst the approaches? (Having rejected 
personal preference and performance as criterion, one might well 
wonder what's left? I mean something like community consensus about 
which is more elegant, etc. where there is enough agreement to take it 
out of the realm of pure personal preference. And, seeing how I've 
phrased it, I think `that's unanswerable' might well be a perfectly 
acceptable answer. :-) )

Alternatively, of the two ways you gave (the generator above and the 
helper function route), which seems better? All I have to guide me is 
unfamiliarity with generators, and that isn't the best compass.

Thanks again,

Brian vdB

More information about the Tutor mailing list