Wishlist item: itertools.flatten
Michael Spencer
mahs at telcopartners.com
Mon Mar 14 13:02:23 EST 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