[Python-ideas] Default arguments in Python - the return - running out of ideas but...
MRAB
google at mrabarnett.plus.com
Thu May 14 00:20:49 CEST 2009
Steven D'Aprano wrote:
> On Thu, 14 May 2009 05:18:37 am CTO wrote:
>
>> If you thought not reevaluating function expressions
>> was confusing for newbies, wait until you see what making up a new
>> kind of yield will do for them.
>>
>> Why not just push for some decorators that do this to be included in
>> stdlib? I see the utility, but not the point of adding extra syntax.
>
> Even if a decorator solution can be made to work, it seems to me that
> the difficulty with a decorator solution is that it is
> all-or-nothing -- you can decorate the entire parameter list, or none
> of the parameters, but not some of the parameters. You can bet that
> people will say they want delayed evaluation of some default arguments
> and compile-time evaluation of others, in the same function definition.
>
> There are work-arounds, of course, but there are perfectly adequate
> work-arounds for the lack of delayed evaluation defaults now, and it
> hasn't stopped the complaints.
>
> I'm going to suggest that any syntax should be applied to the formal
> parameter name, not the default value. This feels right to me -- we're
> saying that it's the formal parameter that is "special" for using
> delayed semantics, not that the default object assigned to it is
> special. Hence it should be the formal parameter that is tagged, not
> the default value.
>
> By analogy with the use of the unary-* operator, I suggest we use a new
> unary-operator to indicate the new semantics. Inside the parameter
> list, &x means to delay evaluation of the default argument to x to
> runtime:
>
> def parrot(a, b, x=[], &y=[], *args, **kwargs):
>
> As a bonus, this will allow for a whole new series of bike-shedding
> arguments about which specific operator should be used. *grin*
>
> Tagging a parameter with unary-& but failing to specify a default value
> should be a syntax error:
>
> def parrot(&x, &y=[]):
>
> Likewise for unary-& outside of a parameter list.
>
> Bike-shedding away... *wink*
>
Well, going back to 'def', it could mean 'deferred until call-time':
def parrot(a, b, x=[], y=def [], *args, **kwargs):
More information about the Python-ideas
mailing list