isgenerator(...) - anywhere to be found?

Steven Bethard steven.bethard at gmail.com
Tue Jan 22 13:27:48 EST 2008


Diez B. Roggisch wrote:
> Jean-Paul Calderone wrote:
> 
>> On Tue, 22 Jan 2008 15:15:43 +0100, "Diez B. Roggisch"
>> <deets at nospam.web.de> wrote:
>>> Jean-Paul Calderone wrote:
>>>
>>>> On Tue, 22 Jan 2008 14:20:35 +0100, "Diez B. Roggisch"
>>>> <deets at nospam.web.de> wrote:
>>>>> For a simple greenlet/tasklet/microthreading experiment I found myself
>>>>> in the need to ask the question
>>>>>
>>>>> [snip]
>>>> Why do you need a special case for generators?  If you just pass the
>>>> object in question to iter(), instead, then you'll either get back
>>>> something that you can iterate over, or you'll get an exception for
>>>> things that aren't iterable.
>>> Because - as I said - I'm working on a micro-thread thingy, where the
>>> scheduler needs to push returned generators to a stack and execute them.
>>> Using send(), which rules out iter() anyway.
>> Sorry, I still don't understand.  Why is a generator different from any
>> other iterator?
> 
> Because you can use send(value) on it for example. Which you can't with
> every other iterator. And that you can utizilize to create a little
> framework of co-routines or however you like to call it that will yield
> values when they want, or generators if they have nested co-routines the
> scheduler needs to keep track of and invoke after another.

So if you need the send() method, why not just check for that::

     try:
         obj.send
     except AttributeError:
         # not a generator-like object
     else:
         # is a generator-like object

Then anyone who wants to make an extended iterator and return it can 
expect it to work just like a real generator would.

STeVe



More information about the Python-list mailing list