You can simply return the generator expression from __iter__()
class MyList(list): def __iter__(self): return (self.do_something(x) for x in list.__iter__(self)) def do_something(self, x): print 'do something', x return x my_list = MyList(range(10)) print my_list for item in my_list: print item
ncoghlan suggests using a generator instead of a generator expression, making debugging easier
class MyList(list): def __iter__(self): for x in list.__iter__(self): yield self.do_something(x) def do_something(self, x): print 'do something', x return x my_list = MyList(range(10)) print my_list for item in my_list: print item
Alternatively you can use imap here
from itertools import imap class MyList(list): def __iter__(self): return imap(self.do_something, list.__iter__(self)) def do_something(self, x): print 'do something', x return x my_list = MyList(range(10)) print my_list for item in my_list: print item
John la rooy
source share