> That's not what I would say. I would say that you
> should design your code so that you don't *need*
> to find out whether it's an iterator or not. Instead,
> you just require an iterator, always, and trust that
> the calling code will give you one. If it doesn't,
> your unit tests will catch that. (You *do* have
> unit tests, don't you?-)

That's a nice general sentiment, but not always feasible -- especially if
you're writing library code.  Remember, I'm thinking about abilities in
general, not just whether a type is an iterator.  For example, testing
whether something is an iterator by trying to call its next() method is
destructive if it succeeds.  So consider the following:

        def concat(x, y):
                for a in x: yield a
                for a in y: yield a

Simple as this function may be, it has a drawback: If x is an iterator and y
is not a valid sequence, the function consumes x before failing.  If it were
possible to determine nondestructively whether y is a sequence, the function
would not have this drawback.  The drawback in this particular example may
be trivial; but similar drawbacks can be serious in other contexts,
especially where networking is involved.

> Your ability-signallers seem to be something akin to
> the Haskell notion of typeclasses. A typeclass is not
> itself a type, but represents a set of characteristics
> that a type can have

To the extent that I'm familiar with Haskell, I think you're right.



_______________________________________________
Python-3000 mailing list
Python-3000@python.org
http://mail.python.org/mailman/listinfo/python-3000
Unsubscribe: 
http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com

Reply via email to