[Python-Dev] Re: PEP 279 (original) (raw)

James Althoff jamescalthoff@yahoo.com
Thu, 4 Apr 2002 11:25:56 -0800


This is a multi-part message in MIME format.

------=_NextPart_000_0005_01C1DBCB.7D512B00 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable

[David Abrahams]

. . . I want to put in another plug for itemize(),

Well, since we're doing post-Pronouncement fantasizing . . .

here's one more plug for "itemize".

Noting that

for k,v in adict.iteritems():

is probably as useful as

for i,v in enumerate(aseq):

why not change the spec to:

def itemize(iterable): ... # use iteritems if defined ... try: ... for item in iterable.iteritems(): yield item ... except AttributeError: pass ... # and then everything as before ... i =3D 0 ... iterator =3D iter(iterable) ... while 1: ... yield i,iterator.next() ... i +=3D 1 ...

So "itemize(iterable)" returns an iterator that yields (k,v) pairs from = the iterable.iteritems() method if defined, else pairs generated by = associating 0,1,...,n-1 with n values from iter(iterable).

This allows

for k,v in itemize(adict_or_aseq):

to be written uniformly for dicts and seqs.

And makes=20

list(itemize(adict)) =3D=3D adict.items()

work, removing one of the objections to the name "itemize".

Also, if one were to need, for example, a sequence whose indices start = at 1 instead of 0, one could define a sequence class that implements = iteritems and objects of said class would work just fine with "itemize".

Jim

------=_NextPart_000_0005_01C1DBCB.7D512B00 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable

[David Abrahams]
> . . . I want to put in = another plug for=20 itemize(),
Well, since we're doing = post-Pronouncement=20 fantasizing . . .
 
here's one more plug for=20 "itemize".
 
Noting that
 
    for k,v in=20 adict.iteritems():
 
is probably as useful as
 
    for i,v in=20 enumerate(aseq):
 
why not change=20 the spec to:
 
>>> def=20 itemize(iterable):
...     # use iteritems if=20 defined
...    =20 try:
...         for item in=20 iterable.iteritems(): yield item
...     except=20 AttributeError: pass
...     # and then = everything as=20 before
...     i =3D = 0
...    =20 iterator =3D iter(iterable)
...     while=20 1:
...         yield=20 i,iterator.next()
...         = i +=3D=20 1
...
So = "itemize(iterable)" returns an=20 iterator that yields (k,v) pairs from the iterable.iteritems() method if =

defined, else pairs generated by associating 0,1,...,n-1 with n values = from=20 iter(iterable).

<FONT=20 size=3D2> 
This=20 allows
<FONT=20 size=3D2> 
<FONT face=3D"Courier New">    = for k,v in=20 itemize(adict_or_aseq):
<FONT=20 size=3D2> 
to be written = uniformly for dicts=20 and seqs.
 
And makes
 
<FONT face=3D"Courier New" size=3D2>    = list(itemize(adict)) =3D=3D=20 adict.items()
<FONT face=3D"Courier New" size=3D2> 
work, removing one of the objections to = the name=20 "itemize".
<FONT=20 size=3D2> 
Also, if one were to = need, for=20 example, a sequence whose indices start at 1 instead of 0, one = could define=20 a  sequence class that implements iteritems and objects of said = class would=20 work just fine with = "itemize".
<FONT=20 size=3D2> 
<FONT=20 size=3D2>Jim

------=_NextPart_000_0005_01C1DBCB.7D512B00--