In python 2.x, Checking for the __iter__
attribute was helpful (though not always wise), because iterables should have this attribute, but strings did not.
def typecheck(obj): return hasattr(myObj, '__iter__')
The down side was that __iter__
was not a truely Pythonic way to do it: Some objects might implement __getitem__
but not __iter__
for instance.
In Python 3.x, strings got the __iter__
attribute, breaking this method.
The method you listed is the most efficient truely Pythonic way I know in Python 3.x:
def typecheck(obj): return not isinstance(obj, str) and isinstance(obj, Iterable)
There is a much faster (more efficient) way, which is to check __iter__
like in Python 2.x, and then subsequently check str
.
def typecheck(obj): return hasattr(obj, '__iter__') and not isinstance(obj, str)
This has the same caveat as in Python 2.x, but is much faster.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…