Wishlist item: itertools.flatten

Michael Spencer mahs at telcopartners.com
Mon Mar 14 19:02:23 CET 2005


Leif K-Brooks wrote:
> Michael Spencer wrote:
> 
>>             if hasattr(item,"__iter__"): # Avoids iterating over strings
> 
> 
> That's probably the cleanest way to avoid strings, but it's 
> unfortunately not a good idea IMHO. Many objects (IndexedCatalog's 
> Result objects are what I'm concerned about, but there are undoubtedly 
> others) still rely entirely on the old-style sequence iteration protocol 
> even though they're proper containers, so checking for __iter__ wouldn't 
> work on them.  Explicitly doing isinstance(item, basestring) is probably 
> the best option until older objects move to the new iteration protocol.
Sure, the preceding part of my post:

> One issue is specifying iterable types which should be atomic (notably strings).  This uses a simple hardwired test for that.

...makes it clear that 'hasattr(item,"__iter__")' is not claiming to be a 
general atomicity test.

Using something like:
if not isinstance(item, basestring):
     try:
	iterator = iter(item)
     etc...

...defines a rule that works for your case, but it also means that any 
non-basestring class that implements __getitem__ gets flattened.  That may be 
what you want...or not.

I think flatten is a special-case function, and it is therefore most practical 
to define its atomicity rules on a case-by-case basis.

Michael









More information about the Python-list mailing list