a = b = 1 just syntactic sugar?

Michael Chermside mcherm at mcherm.com
Thu Jun 5 14:51:03 EDT 2003


Ed Avis writes:
> It seems a bit perverse that setattr is allowed in lambda expressions
> but assignment is not; that you can call setdefault to update a
> dictionary, but not simply set the dictionary's elements; that you can
> do sys.stdout.write but not print; that you can call a function which
> asserts but not call assert.
> 
> If lambda accepted statements as well as expressions - or if a
> statement could be used as an expression, as in C - then these warts
> would not arise.

True, but as usual, there's a reason for it. Lambda was intended[1] for
one purpose and one purpose only... to permit simple anonymous functions
to be used in places where the succinctness makes it more readable than 
using def to make a named function. Such places are rare except when
using functional style programming, where they are quite common. But
in functional style programming you (nearly always) do NOT want 
expressions to have side effects.

So lambda is defined to allow only expressions, and is *intended* for
simple, side-effect-free functions. While there's nothing *preventing*
you from calling a function with side effects, the prohibition on
using statements tends to discourage it. Good style is encouraged,
but you can violate the rules if you really want to (and know what
you're doing). If you want more, use def, and give it a name.

[1] This is only my own opinion of how and why Lamda works the way it
  does. In particular, Guido would disagree. He would say that lambda
  was included to satisfy the requests from lisp refugees, and that
  if he had it to do over he wouldn't just choose a better keyword,
  he'd prohibit the whole thing and require def everywhere. On this
  point I respectfully disagree with him... I find lambda to be quite
  nice, but ONLY when used for very small side-effect-free functions.
  And if I had a complaint, it wouldn't be about the (rarely needed
  and easily worked-around) prohibition on assignment statements,
  but about the (frequently needed and impossible to work around) lack
  of a conditional expression.

But-we-won't-bug-Guido-about-the-results-of-that-vote-until-after-2.3 lly,

-- Michael Chermside






More information about the Python-list mailing list