isiter builtin
Peter Otten
__peter__ at web.de
Sun Nov 16 04:04:16 EST 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