[Python-3000] pre-PEP: Default Argument Expressions

Mike Klaas mike.klaas at gmail.com
Wed Feb 14 05:44:08 CET 2007

On 2/13/07, Chris Rebert <cvrebert at gmail.com> wrote:
>      This PEP proposes new semantics for default arguments to remove
>      boilerplate code associated with non-constant default argument values,
>      allowing them to be expressed more clearly and succinctly.
> Specifically,
>      all default argument expressions are re-evaluated at each call as
> opposed
>      to just once at definition-time as they are now.

Seems like a huge barrel of worms.  The binding semantics are not only
a problem for mutable arguments, as you state in your pep:

In [2]: def a():
   ...:     g = 1
   ...:     def b():
   ...:         print g
   ...:     g = 2
   ...:     return b
In [4]: a()()

In [5]: def a():
   ...:     g = 1
   ...:     def b(g=g):
   ...:         print g
   ...:     g = 2
   ...:     return b
In [6]: a()()

Creating closures and define-time local bindings is certainly not as
common as a "regular" function definition, it is important part of
python when programming in a semi-functional style.  Imagine that "def
b" is in a for loop.  Your presented alternatives either don't work or
go to rather extreme effort to duplicate this simple and useful

I agree that newbies stumble over mutable default arguments.  I did.
If we could improve that learning process, I would be all for it.
However, besides this being a significant change in semantics, two
main stumbling blocks in my mind are:

1. Scoping.  Scoping issues are not minor consequences of changes to
default argument behaviour, but are integral.  I think that you'd have
to come up with a more obvious way to accomplish all the various
current behaviours of def args before changing their semantics.  This
is probably a larger project than the original proposal.

2. Performance.  The speed of python is influenced greatly by the
performance of function dispatch.  This may not show up in pystone.


More information about the Python-3000 mailing list