Confusion about iterator types

Kirby Urner urner at
Sun Aug 12 00:30:15 CEST 2001

In types, I find SequenceIterType and FunctionIterType.

When I go:

  >>> mylist = [1,2,3,4]
  >>> myiter = iter(mylist)

I then get:

  >>> type(myiter)
  <type 'iterator'>

But 'iterator' by itself has no corresponding type in types.  

If I use the isinstance() method, I can confirm that myiter is a
SequenceIterType, but shouldn't it just tell me that?  Shouldn't 
type(foo) return a type name that more closely matches its type 
in types?  Why not have?:
 >>> type(myiter)
 <type 'sequence-iter'>

Also, some clarification re the below would be helpful:

  >>> def f(n): return n*n

  >>> callable(f)
  >>> k = iter(f,10)
  >>> type(k)
  <type 'callable-iterator'>
  >>> k()
  Traceback (most recent call last):
    File "<pyshell#142>", line 1, in ?
  TypeError: object is not callable: <callable-iterator object at 00B6D10C>

In IDLE, when I go >>> iter(  I'm prompted that the syntax is 
iter(collection) -> iterator.  Yet the PEP leads me to this other use 
of iter(v, w) where v must be callable.

Simply obeying that rule allows me to get as far as defining f above
(callable) and getting some callable-iterator k.  I don't know what this 
should mean or do in this context, but it's apparently legal -- until I 
actually try to call this callable-iterator, and get the error message that
this object isn't callable.  Just from a logical consistency point of view,
it seems that any object calling itself a callable-iterator shouldn't turn
around and tell me it ain't callable.

And again, there's no 'callable-iterator' type in types.

I find that my object is a FunctionIterType:

 >>> isinstance(k,types.FunctionIterType)

Seems the types name should therefore be CallableIter or the returned
type should be <type 'function-iter'> (corresponding to <type 'sequence-iter'>).


More information about the Python-list mailing list