I can think of two ways to determine whether an object is a sequence:
hasattr(object, '__iter__').iter(object) raises a TypeError.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?
Use isinstance(obj, collections.Sequence). Abstract base classes are exactly for this. They didn't exist prior to 2.6 though. In case you're forced to use older versions, you're out of luck and better stick with EAFP.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With