On Wed, 2007-07-25 at 11:58 -0700, [EMAIL PROTECTED] wrote: > You can use the built-in dir() function to determine whether or not > the __iter__ method exists: > > class Iterable(object): > def __iter__(self): > pass > > class NotIterable(object): > pass > > def is_iterable(thing): > return '__iter__' in dir(thing) > > print 'list is iterable = ', is_iterable(list()) > print 'int is iterable = ', is_iterable(10) > print 'float is iterable = ', is_iterable(1.2) > print 'dict is iterable = ', is_iterable(dict()) > print 'Iterable is iterable = ', is_iterable(Iterable()) > print 'NotIterable is iterable = ', is_iterable(NotIterable()) > > Results: > list is iterable = True > int is iterable = False > float is iterable = False > dict is iterable = True > Iterable is iterable = True > NotIterable is iterable = False
Testing for __iter__ alone is not enough: >>> class X(object): ... def __getitem__(self,i): ... if i<10: return i ... else: raise IndexError, i ... >>> x = X() >>> is_iterable(x) False >>> iter(x) <iterator object at 0xb7f0182c> >>> for i in x: print i ... 0 1 2 3 4 5 6 7 8 9 No __iter__ in sight, but the object is iterable. -- Carsten Haese http://informixdb.sourceforge.net -- http://mail.python.org/mailman/listinfo/python-list