Why python doesn't use syntax like function(, , x) for default parameters?

Duncan Booth duncan.booth at invalid.invalid
Fri Mar 10 04:51:01 EST 2006


Dmitry Anikin wrote:

> Is there some contradiction in python syntax which disallows
> an easy implementation of this feature, or just nobody bothered
> with this? If former is the case, please show me why, because
> I badly need this feature in embedded python app (for
> compatibility with other language that uses such syntax) and might
> venture to implement it myself, so don't want to waste time
> if it's gonna break something.
> 
I think you would find it hard to implement exactly that in Python. Of 
course what you can do easily enough is invent a magic 'missing' value and 
map Python calls of:

   a_func(missing, missing, 3)

to a call of:

   a_func(,,3)

in your other language. It seems to me though that writing:

   a_func(z=3)

ought to be clearer to anyone reading the code, especially when you come 
back to your code in 6 months time and find:

   b_func(,,,,,,,,,,,1,,,,2)


Remember Python is a dynamic language, so the compiler cannot tell which 
function you are actually calling. In a statically bound language parameter 
defaults are often restricted to constant values and the default values are 
simply inserted in place of any missing arguments when the call is 
compiled. That isn't possible in Python, so the interpreter has to insert 
the missing values when you actually make the call. The code to do that is 
complex enough with the current restrictions.

To allow arbitrary arguments to be defaulted, I think you would have to add 
a new magic value to represent a missing parameter, make the compiler pass 
that in place of any omitted positional parameters, and then make the 
function call code check all parameters to see if they are missing values 
and if so substitute the actual default. It would be possible, but it  
doesn't really give you any additional power since you can already do that 
in the cases where you need it by using keyword arguments or by passing an 
explicit value to mean 'replace this parameter by some other canned value'.



More information about the Python-list mailing list