[Python-ideas] keyword arguments everywhere (stdlib) - issue8706

Steven D'Aprano steve at pearwood.info
Tue Mar 6 01:00:31 CET 2012

Greg Ewing wrote:
> Steven D'Aprano wrote:
>> Please do not give syntactic meaning to [parameter], unless it matches 
>> the existing convention for optional parameters.
> Why should it have to do that? We already have a syntax for
> optional parameters, and there is no reason for a reader to
> think that a new piece of syntax is simply duplicating existing
> functionality.

I see your later comment about metasyntax, but to clarify in case there is 
still any lingering doubt what I mean:

When reading function signatures in *documentation*, we often see 
func([parameter]) used to indicate that parameter is an optional argument. If 
your proposal is enacted, when reading function signatures in *code*, we will 
see func([parameter]) used to indicate that you can't use parameter as a 
keyword argument.

The two uses clash, which means that every time we see a [parameter] in a 
function signature, there will be a moment of disorientation where we have to 
decide whether it should be interpreted using the convention for code or the 
convention for documentation.

Certainly there are ways of distinguishing the two from context, particularly 
if the default value is shown in the signature, or from subtleties of whether 
the comma is inside the brackets or not, or perhaps from the order ([] early 
in the signature probably means positional, [] at the end probably means 

My point is not that it is impossible to distinguish optional from positional 
arguments, but that the similarity of syntax makes it difficult to distinguish 
the two *at a glance* and comprehensibility will be reduced.

And heaven help us if we have a function like range with positional-only 
optional parameters:

range([[start]=0,] [end] [, [step]=1]) --> iterable

For the avoidance of doubt, I am *not* suggesting that we introduce 
[parameter] as syntax for optional arguments. I don't want to see [] used 
syntactically inside def func(...) at all, except for the VERY rare use of 
lists as mutable default arguments.


More information about the Python-ideas mailing list