I've been reading about how "lambda" is going away in Python 3000 (or at least, that's the stated intent), and while I agree for the most part with the reasoning, at the same time I'd be sad to see the notion of "anonymous functions" go - partly because I use them all the time.
Of course, one can always create a named function. But there are a lot of cases, such as multimethods / generics and other scenarios where functions are treated as data, where you have a whole lot of functions and it can be tedious to come up with a name for each one. For example, my current hobby project is implementing pattern matching similar to Prolog in Python. The dispatcher I am making allows you to create "overloaded" versions of a function that take different patterns as their input arguments, so that Simplify( (add, x, y) ) calls a different method than Simplify( (log, x) ) -- in other words, the choice of which code is executed is based on the structure of the tuple that is passed into it. However, in order for this to work, I need to be able to assign a block of Python code to a particular pattern, and having to invent a named function for each pattern is a burden :) Anyway, here's an example, then, of how 'def' could be used: add = def( a, b ): return a + b The lack of a function name signals that this is an anonymous function. The def keyword defines the function using the same syntax as always - the arguments are in parentheses, and are unevaluated; The colon marks the beginning of a suite. In fact, it looks a lot like the existing lambda, with a couple of differences: 1) It uses the familiar "def" keyword, which every Python beginner understands, instead of the somewhat unfamiliar "lambda" 2) The arguments are enclosed in parentheses, instead of a bare tuple followed by a colon, again reiterating the similarity to the normal usage of "def". 3) The statements are a real suite instead of a pseudo-suite - they can consist of multiple lines of statements. Like all statements whose last argument is a suite, you can put the body of the function on a single line: add = def( a, b ): return a + b (If this were Perl, you could also omit the "return", since in Perl the last evaluated expression in the function body is what gets returned if there's no explicit return statement.) What about passing an anonymous function as an argument, which is the most common case? This gets tricky, because you can't embed a suite inside of an expression. Or can you? The most powerful option would be to leverage the fact that you can already do line breaks inside of parentheses. So the "def" keyword would tell the parser to restart the normal indentation calculations, which would terminate whenever an unmatched brace or paren was encountered: a = map( (def( item ): item = do_some_calculation( item ) return item ), list ) The one-liner version looks a lot prettier of course: a = map( (def( item ): return item * item), list ) And it looks even nicer if we switch the order of the arguments around, since you can now use the final paren of the enclosing function call to terminate the def suite. a = map( list, def( item ): return item * item ) Unfortunately, there's no other good way I can think of to signal the end of the block of statements without introducing some radical new language construct. (Besides, if being an expression is good enough for 'yield', why shouldn't def get the same privilege? :) -- http://mail.python.org/mailman/listinfo/python-list