isiter builtin

Peter Otten __peter__ at web.de
Sun Nov 16 10:04:16 CET 2014


Garrett Berg wrote:

> I have been working with python for a few years now, and two of my
> favorite features about it are iterators and duck typing. The fact that
> every iterator under the sun can be accessed with a simple for loop is one
> of the most amazing features of python.
> 
> However, there are times when I want to do type checking, and the builtin
> function *isinstance* is of great use. However, this function fails to be
> satisfactory in returning whether the object is a valid iterator. The call
> hasattr(obj, '__iter__') also fails because str and bytes types both have
> that, and are rarely what you mean when you are asking if something is an
> iterator (how often have you iterated over a string?)
> 
> I propose a new builtin to address this problem. I have created code for
> it here:
> 
> https://gist.github.com/cloudformdesign/de9b54d30547ddd28ec4

I see no reason not to inline this short function:

> def isiter(obj, exclude=(str, bytes, bytearray)):
>     '''Returns True if object is an iterator.
>     Returns False for str, bytes and bytearray objects
>     by default'''
>     return (False if isinstance(obj, exclude)
>             else True if hasattr(obj, '__iter__')
>             else False)

Why not

      return hasattr(obj, "__iter__") and not isinstance(obj, exclude)

> This will allow simple type checking on an input to determine whether it
> is an iterator.

You mean "iterable".

I'd like to see a few of your use-cases. I think most the time you don't mix 
arbitrary iterables, so to walk a tree like

["alpha", "beta", [3, "delta", ["epsilon", "zeta"]]]

isinstance(obj, list) would be sufficient. Likewise for

["alpha", iter("abc"), ["beta", ["gamma"]]]

isinstance(obj, str) would work.




More information about the Python-list mailing list