How to make an empty generator?

Robert Kern robert.kern at
Fri Feb 19 07:15:20 CET 2010

On 2010-02-18 19:28 PM, Mel wrote:
> Steven D'Aprano wrote:
>> On Thu, 18 Feb 2010 17:30:54 -0600, Robert Kern wrote:
>>>   >  If all you want is a generator that doesn't yield anything, then
>>>   >  surely there isn't any one-time processing and you don't need the
>>>   >  comment?
>>> Sure there is. Python doesn't know that nothing gets yielded until it
>>> hits the return statement before the yield. When it calls .next() on the
>>> iterator, the code elided by the comment executes, then the return is
>>> hit, a StopIteration exception is raised, and the iteration is complete.
>> I don't understand why you care about having *any* code before the
>> StopIteration. That's like:
>> def empty():
>>      for x in range(1000):
>>          pass # Spin wheels uselessly
>>      return
>>      yield
>> What's the point of the wheel spinning? Did I miss something?
> I wonder whether it's for some kind of framework with a main loop like
> for it in list_of_iterables:
>      for x in it:
>          do_this_or_that (x)
> where, every once in a while one wants to throw some arbitrary code into the
> process, in the form of an empty iterable with side effects.

Yes. That is exactly what the OP said in his original post:

I have some generators that do stuff, then start yielding results. On occasion, 
I don't want them to yield anything ever-- they're only really "generators" 
because I want to call them /as/ a generator as part of a generalized system.

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