On 18 Nov 2005 05:08:39 -0800, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> wrote:
>This works exactly as you would expect:: > > from time import sleep > def foo(on='ABC'): > for e in list(on): > sleep(1) > yield e > >When I run this on the command line It takes about 3 seconds to >complete and the first letter is shown after 1 second. >But, how do I wrap the function somewhere else:: > > from time import sleep > def foo(on): > for e in list(on): > sleep(1) > yield e > > def wrapper(x): > if x < 0: > return foo('ABC') > else: > return foo('XYZ') > >When I run this, variable three letters are shown and it takes 3 >seconds for the whole thing to complete. The problem is that the whole >iteration is glogged up in the wrapper() function because the first >letter is shown after 3 seconds and then all letters are shown at the >same time. > >How do I wrap functions that return iterators? ...if possible. > Make the wrapper itself an iterable? E.g., is this the effect you wanted? >>> from time import sleep >>> def foo(on): ... for e in on: ... sleep(1) ... yield e ... >>> def wrapper(x): ... if x < 0: ... for e in foo('ABC'): yield e ... else: ... for e in foo('XYZ'): yield e ... >>> wrapper(-1) <generator object at 0x02EF3D8C> >>> import sys >>> for c in wrapper(-1): sys.stdout.write(c); sys.stdout.flush() ... ABC>>> >>> for c in wrapper(+1): sys.stdout.write(c); sys.stdout.flush() ... XYZ>>> Regards, Bengt Richter -- http://mail.python.org/mailman/listinfo/python-list