How to make an empty generator?

Robert Kern robert.kern at
Fri Feb 19 01:20:49 CET 2010

On 2010-02-18 17:36 PM, Stephen Hansen wrote:
> On Thu, Feb 18, 2010 at 2:56 PM, Robert Kern <robert.kern at
> <mailto:robert.kern at>> wrote:
>     class once(object):
>         def __init__(self, func, *args, **kwds):
>             self.func = func
>             self.args = args
>             self.kwds = kwds
>         def __iter__(self):
>             return self
>         def next(self):
>             self.func(*self.args, **self.kwds)
>             raise StopIteration()
> Hmm, yeah. I'd probably tweak it into a decorator and name it
> sideeffect_only or something, but yeah, that's the right approach at least.

Well, with a decorator, you could even use the cringeworthy return/yield syntax 
while keeping it hidden from your users (not to mention reducing the amount of 
boilerplate people need to write).

from functools import wraps

def sideeffect_only(func):
     def wrapper(*args, **kwds):
         func(*args, **kwds)
         # Some helpful comment about why there is a return/yield.
     return wrapper

But you can also write one where the wrapper() returns a once() instance. It 
might be useful to use the once class instead of a generator such that you can 
write code that distinguishes side-effect only iterators from other iterators in 
your system. It might be useful for debugging if nothing else.

Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
  that is made terrible by our own mad attempt to interpret it as though it had
  an underlying truth."
   -- Umberto Eco

More information about the Python-list mailing list