[Python-ideas] One more time... lambda function <--- from *** signature def.

Andrew Barnert abarnert at yahoo.com
Sat Mar 1 04:58:08 CET 2014


On Feb 28, 2014, at 18:13, Ron Adam <ron3200 at gmail.com> wrote:

> So functions can't be extended to take a triplet instead of a pair...
> 
>     (*args, **kwds, ***expr)

The more you elaborate this, the more this looks like Ruby procs: You get any number of normal arguments, then at most one special kind of callback thing which must come at the end.

I'm not sure which use cases this solves. It doesn't work for expressions that need an argument, like a sorting key function. It also doesn't work for pre-existing functions that weren't designed to take ***expr, like Button or takewhile. And wrapping the expression in a call to a forwarding function doesn't seem any less verbose or more readable than just using lambda.

Anyway, there are two fundamental problems with anything that doesn't require any syntax at the call site. First, it's not obvious, or even easily discoverable, to the reader when you're passing a quoted expression and when you're passing a value. Second, it's not discoverable to the compiler.

Going back to the analogies from other languages again, Lisp gets around this by making functions and macros different things. Among other differences, a macro always gets expressions instead of values, without any need to quote them at the call site. And, as Haoyi Li has pointed our multiple times on the other threads, you can already do the same thing in Python (with MacroPy).


More information about the Python-ideas mailing list