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

Steven D'Aprano steve at pearwood.info
Sat Mar 3 03:57:52 CET 2012


Ethan Furman wrote:
> Guido van Rossum wrote:
>> On Fri, Mar 2, 2012 at 2:49 PM, Ethan Furman <ethan at stoneleaf.us> wrote:
>>> Terry Reedy wrote:
>>>> On 3/2/2012 3:32 PM, Ethan Furman wrote:
>>>>
>>>>> So something like:
>>>>>
>>>>> def ord(char, ?):
>>>>>
>>>>> def split(self, char, ?, count)
>>>>>
>>>>> def canary(breed, ?, color, wingspan, *, name)
>>>>
>>>> That is probably better than using '$' or directly tagging the names.
>>>
>>> I chose '?' because it has some similarity to an incompletely-drawn 
>>> 'p', and
>>> also because it suggests a sort of vagueness, as in not being able to
>>> specify the name of the argument.
>>
>> I'd rather not start using a new punctuation character for this one
>> very limited purpose; it might prevent us from using ? for some other
>> more generic purpose in the future.
>>
>> Alternative proposal: how about using '/' ? It's kind of the opposite
>> of '*' which means "keyword argument", and '/' is not a new character.
>>
> 
> So it would look like:
> 
>   def ord(char, /):
> 
>   def split(self, char, /, count)
> 
>   def canary(breed, /, color, wingspan, *, name)
> 
> 
> I think I like that better -- it stands out, and it looks like a barrier 
> between the positional-only and the positional-keyword arguments.


Urrggg, ugly and hard to read. Imagine, if you will:

def spam(x, /, y, /, z, /, a=2/3, /):
     ...

Placing the tag after the argument as an extra parameter is not the right 
approach in my opinion. It's excessively verbose, and it puts the tag in the 
wrong place: as you read from left-to-right, you see "normal argument, no, 
wait, it's positional only". The tag should prefix the name.

With keyworld-only arguments, the * parameter is special because it flags a 
point in the parameter list, not an individual parameter: you read "normal 
arg, normal arg, start keyword-only args, keyword-only arg, ...".

I believe that the right place to tag the parameter is in the parameter 
itself, not by adding an extra parameter after it. Hence, something like this:

def spam(~x, ~y, ~z, ~a=2/3):
     ...

where ~name means that name cannot be specified by keyword. I read it as "not 
name", as in, the caller can't use the name.

Or if you prefer Guido's pun:

def spam(/x, /y, /z, /a=2/3):
     ...

Much less line-noise than spam(x, /, y, /, z, /, a=2/3, /).


Personally, I think this is somewhat of an anti-feature. Keyword arguments are 
a Good Thing, and while I don't believe it is good enough to *force* all C 
functions to support them, I certainly don't want to discourage Python 
functions from supporting them.



-- 
Steven



More information about the Python-ideas mailing list