On Feb 5, 1:16 pm, Michele Simionato <michele.simion...@gmail.com> wrote: > On Feb 5, 7:24 pm, a...@pythoncraft.com (Aahz) wrote: > > > In article > > <a22c77c4-a812-4e42-8972-6f3eedf72...@l33g2000pri.googlegroups.com>, > > Michele Simionato <michele.simion...@gmail.com> wrote: > > > >Looks fine to me. In some situations you may also use hasattr(el, > > >'__iter__') instead of isinstance(el, list) (it depends if you want to > > >flatten generic iterables or only lists). > > > Of course, once you do that, you need to special-case strings... > > Strings are iterable but have no __iter__ method, which is fine in > this context, since I would say 99.9% of times one wants to treat them > as atomic objects, so no need to special case.
Don't worry, that little oddity was fixed for you: Python 3.0+ (unknown, Dec 8 2008, 14:26:15) [GCC 4.3.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> str.__iter__ <slot wrapper '__iter__' of 'str' objects> >>> bytes.__iter__ <slot wrapper '__iter__' of 'bytes' objects> >>> bytearray.__iter__ <slot wrapper '__iter__' of 'bytearray' objects> I'm in the "why do you need more than 1 depth?" camp. Dispatching based on your own type should be given an extra look. Dispatching based passed in types should be given three extra looks. I didn't realize itertools.chain(*iterable) worked. I guess that needs to be pushed as the canonical form. -- http://mail.python.org/mailman/listinfo/python-list