[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:
> > 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).
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.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