[Python-ideas] Optional kwarg making attrgetter & itemgetter always return a tuple

Jim Jewett jimjjewett at gmail.com
Fri Sep 14 23:02:31 CEST 2012


On 9/14/12, Oscar Benjamin <oscar.j.benjamin at gmail.com> wrote:

> I can see why you would expect different behaviour here, though. I tend not
> to think of the functions in the operator module as convenience functions
> but as *efficient* nameable functions referring to operations that are
> normally invoked with a non-function syntax. Which is more convenient out
> of the following:

> 1) using operator
> import operator
> result = sorted(values, key=operator.attrgetter('name'))

I would normally write that as

    from operator import attrgetter as attr
    ... # may use it several times

    result=sorted(values, key=attr('name'))

which is about the best I could hope for, without being able to use
the dot itself.

> 2) using lambda
> result = sorted(values, key=lambda v: v.name)

And I honestly think that would be worse, even if lambda didn't have a
code smell.  It focuses attention on the fact that you're creating a
callable, instead of on the fact that you're grabbing the name
attribute.

> In general it is bad to conflate scalar/sequence semantics so that a caller
> should get a different type of object depending on the length of a
> sequence.

Yeah, but that can't really be solved well in python, except maybe by
never extending an API to handle sequences.  I would personally not
consider that an improvement.

Part of the problem is that the cleanest way to take a variable number
of arguments is to turn them into a sequence under the covers (*args),
even if they weren't passed that way.

-jJ



More information about the Python-ideas mailing list