I can think of two ways to determine whether an object is a sequence:
hasattr(object, '__iter__')
.- And whether calling
iter(object)
raises aTypeError
.
As it is most Pythonic to ask forgiveness than to ask permission, I'd use the second idiom, although I consider it more ugly (additionally, raising an exception once you've caught the TypeError
to determine that the object isn't a sequence would yield an undesirable "double-exception" stack trace).
Ultimately, is checking that an object defines an __iter__
method exhaustive enough to determine whether an object is a sequence? (In older versions of Python, for example, str
didn't define an __iter__
method; I've also heard that some objects can also simply define and use __getitem__
without defining an __iter__
and act like a sequence.) Or is defining __iter__
the contract of a sequence?