[Python-3000] Adding sorting to generator comprehension

Josiah Carlson jcarlson at uci.edu
Thu Apr 27 00:19:41 CEST 2006


Ian Bicking <ianb at colorstudy.com> wrote:
> Josiah Carlson wrote:
> > Is this desireable? As I said above, yes. Is it a compelling syntax
> > addition? I don't believe so. Do Ian and Talin believe it compelling?
> > It would seem so. The question remains whether others also find it a
> > compelling (or not) addition to the list comprehension or generator
> > expression syntax, vis-a-vis the change in memory and time use of
> > orderby in generator expressions.
>> My ulterior motive for introducing this into generator expressions is 
> that then generator expressions could be used to do LINQ-ish things. 
> This isn't required for that, but it pulls the entire idea together 
> better than a generator expression plus a lambda. List comprehensions, 
> being immediately evaluated, cannot be used in this fashion.

That is quite a circuitous route to get some LINQ syntax into Python. 
Personally, I've never been terribly enamoured with SQL-like syntaxes,
so the idea of orderby (when we can always post-process) isn't terribly
appealing to me.
> This is admittedly a rather roundabout reason for orderby, but it's also 
> a relatively nonintrusive way to introducing a feature for which there 
> is demonstrable demand (since people are already doing this in Python in 
> using even more hackish techniques).

I guess I haven't seen any of these hackish techniques.
> >>? That second one is just there for people who are irrationally opposed 
> >>to lambda, it's not a serious alternative. If someone asked me how to 
> >>sort based on an attribute, I would *never* tell them to use 
> >>operator.attrgetter().
> > 
> > Interesting, I didn't realize that any portion of the standard library
> > was influenced due to 'irrational opposition to lambda'. I could have
> > sworn the opposite (given lambda's use in so many of the standard
> > library modules).
>> Offering operator.attrgetter as an alternative to a simple lambda is 
> either a disingenous argument (because the person so arguing is very 
> unlikely to actually make that choice in their own code, or seriously 
> suggest it to other people), or is based on a desire to use a highly 
> functional style that borders on the irrational. There are some reasons 
> you would use attrgetter, though not many; there's no good reason to use 
> that function with a string literal argument.

I would also argue that not using Python's already built-in
metaprogramming features to solve this particular problem is also
disingenous. More specicifically...
class Getters:
 def __getattr__(self, attr):
 return operator.attrgetter(attr)
 def __getitem__(self, item):
 return operator.itemgetter(item)
G = Getters()
class tpl:
 def __init__(self, *items):
 self.items = items
 def __call__(self, item):
 if len(self.items) == 1:
 return self.items[0](item)
 return tuple(i(item) for i in self.items)
x = sorted(((i.firstname, i.lastname) for i in names),
 key=tpl(G.lastname, G.firstname))
Now that I've gone ahead and both made operator.*getter() more
equivalent from a syntax standpoint, as well as made multi-key sorting
more convenient I'm hard-pressed to find any benefit to orderby instead
of sorted, except for perhaps a speed improvement due to the reduction
in function calls, and as a first step towards a LINQ-ish syntax.
Now that we've gotten that out of the way, do we want LINQ-ish syntax
for Python? As I said earlier in this email, I never much liked SQL
syntax, and LINQ seems to be a variant of SQL embedded in certain parts
of other languages, so I would answer: no, I don't want LINQ-ish syntax
for Python.
 - Josiah


More information about the Python-3000 mailing list

AltStyle によって変換されたページ (->オリジナル) /