[Python-Dev] "groupby" iterator

Phillip J. Eby pje at telecommunity.com
Sun Nov 30 18:48:25 EST 2003

At 09:57 PM 11/30/03 +0100, Alex Martelli wrote:
> > students.sort(key=attrgetter('grade'))  # key=lambda r:r.grade
> > students.sort(key=itemgetter(2))        # key=lambda r:[2]
> > students.sort(key=itemgetter('grade'))  # key=lambda r:r['grade']
>I concur: "overloading" extract to mean (the equivalent of) either
>getattr or getitem depending on the argument type doesn't look
>good, besides making it unusable to extract some items from dicts.
>Since these functions or types are going to be in operator, I think
>we can afford to "spend" two names to distinguish functionality
>(even though attgetter and itemgetter look nowhere as neat as
>extract -- I don't have better suggestions offhand).

How about:

extract(method='foo')   # returns the result of calling 'ob.foo()'

And following the pattern of Zope's old "query" package:

extract(extract(attr='foo'), attr='bar')   # extracts ob.foo.bar
extract(extract(item=10), method='spam')   # extracts ob[10].spam()

i.e., the first (optional) positional argument to extract is a function 
that's called on the outer extract's argument, and the return value is then 
used to perform the main extract operation on.

IIRC, the Zope query package used __getitem__ instead of __call__ on its 
instances as a speed hack, but I don't think we should follow that example.  :)

More information about the Python-Dev mailing list