Yield in a wrapper function

Peter Otten __peter__ at web.de
Fri Nov 18 08:50:53 EST 2005


peterbe at gmail.com wrote:

> from time import sleep
> def foo(on):
>     for e in list(on):

Just 

for e in on:
    #...

is better. The list() constructor defeats much of the laziness you gain by
using a generator.

>         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.

The code you presented is OK. Your diagnosis is probably the result of a of
a misconstrued test case. Something like

for s in wrapper(1):
    print s,
    
seems to work like you described because the text is buffered until the line
is complete. Try

for s in wrapper(1):
    print s

or

import sys
for s in wrapper(1):
    print s,
    sys.stdout.flush() # explicitly flush the buffer

instead.

Peter









More information about the Python-list mailing list