On 2005-12-01, Mike Meyer <[EMAIL PROTECTED]> wrote: > Antoon Pardon <[EMAIL PROTECTED]> writes: >> On 2005-12-01, Mike Meyer <[EMAIL PROTECTED]> wrote: >>> Antoon Pardon <[EMAIL PROTECTED]> writes: >>>> I know what happens, I would like to know, why they made this choice. >>>> One could argue that the expression for the default argument belongs >>>> to the code for the function and thus should be executed at call time. >>>> Not at definion time. Just as other expressions in the function are >>>> not evaluated at definition time. >>> >>> The idiom to get a default argument evaluated at call time with the >>> current behavior is: >>> >>> def f(arg = None): >>> if arg is None: >>> arg = BuildArg() >>> >>> What's the idiom to get a default argument evaluated at definition >>> time if it were as you suggested? >> >> Well there are two possibilities I can think of: >> >> 1) >> arg_default = ... >> def f(arg = arg_default): >> ... > > Yuch. Mostly because it doesn't work: > > arg_default = ... > def f(arg = arg_default): > ... > > arg_default = ... > def g(arg = arg_default): > > That one looks like an accident waiting to happen.
It's not because accidents can happen, that it doesn't work. IMO that accidents can happen here is because python doesn't allow a name to be marked as a constant or unreboundable. > This may not have been the reason it was done in the first place, but > this loss of functionality would seem to justify the current behavior. > > And, just for fun: > > def setdefaults(**defaults): > def maker(func): > def called(*args, **kwds): > defaults.update(kwds) > func(*args, **defaults) > return called > return maker So it seems that with a decorator there would be no loss of functionality. -- Antoon Pardon -- http://mail.python.org/mailman/listinfo/python-list