my favorite line of py code so far

Peter Otten __peter__ at web.de
Sat Nov 9 06:49:35 EST 2013


Peter Cacioppi wrote:

> Peter Otten said:
> 
> 
> ">>> _ = lambda c: lambda x: c(*x)
>>>> list(map(_(P), zip([1,2,3], [6, 5, 4])))
> [Point(x=1, y=6), Point(x=2, y=5), Point(x=3, y=4)]
> 
> ? While the obvious approach would be
> 
>>>> [P(*args) for args in zip([1,2,3], [6, 5, 4])]
> [Point(x=1, y=6), Point(x=2, y=5), Point(x=3, y=4)] "
> 
> I would have coded
>>>> map(_(P), zip([1,2,3], [6, 5, 4]))
> 
> Which is very concise and (to me) quite clear. Forgive me for having a
> bias for fewer characters.

Consider developing a bias for self-explanatory names ;)

> Are you saying it's always preferable to avoid map? 

No. I'm saying that if you have a problem with multiple solutions you should 
pick the boringly obvious one if you plan to reuse or publish the code.

There is no obvious meaning attached to _ -- so don't use it.

> Is map going to be deprecated?

Not to my knowledge. I use it when I already have a function ready 
to be called with the items in a sequence. Continuing the Point example that 
could be

map(Point, xvals, yvals)

or

map(Point.from_tuple, xypairs)

> I sometimes use map, sometimes comprehensions. I suspect other people do
> the same, that's why the language supports map and comprehensions.
> 
> "there is also itertools.starmap(): "
> 
> Thanks, that's a bit closer to what I am doing.  To me the pure combinator
> is more appealing than starmap, but the presence of starmap explains why
> the library wouldn't need the combinator.

I found only a single use of starmap on my machine (and one more in the 
stdlib)

# in redis.client
all_cmds = ''.join(starmap(connection.pack_command,
                           [args for args, options in commands]))

and frankly, I would prefer

all_cmds = "".join(
    connection.pack_command(*args) for args, options in commands)

which by some strange coincidence also requires fewer letters to type.




More information about the Python-list mailing list