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(attr='grade') extract(item=2) 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. :)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4