[Python-ideas] keyword arguments everywhere (stdlib) - issue8706
Ethan Furman
ethan at stoneleaf.us
Sat Mar 3 08:54:58 CET 2012
Guido van Rossum wrote:
> On Fri, Mar 2, 2012 at 6:57 PM, Steven D'Aprano wrote:
>> 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.
>
> And yet people invent decorators and other hacks to insist on
> positional parameters all the time. You *can* have Too Much of a Good
> Thing, and for readability it's better if calls are consistent. If
> most calls to a function use positional arguments (at least for the
> first N positions), it's better to force *all* calls to use positional
> arguments 1-N: the reader may be unfamiliar with the parameter names.
> Also remember the subclassing issue I brought up before.
>
> That said, I can't come up with a syntax that I really like. Here's my
> best attempt, but I'm at most -0 on it: Have a stand-alone '/'
> indicate "all parameters to my left must be positional", just like a
> stand-alone '*' means "all parameters to my right must be keywords".
> If there's no stand-alone '*' it is assumed to be all the way on the
> right; so if there's no '/' it is assumed to be all the way on the
> left. The following should all be valid:
>
> def foo(/, a, b): ... # edge case, same as def foo(a, b): ...
>
> def foo(a, b, /): ... # all positional
>
> def foo(a, b=1, /): ... # all positional, b optional
>
> def foo(a, b, /, c, d): ... # a, b positional; c, d required and
> either positional or keyword
>
> def foo(a, b, /, c, d=1): ... # a, b positional; c required, d
> optional; c, d either positional or keyword
>
> def foo(a, b, /, c, *, d): ... # a, b positional; c required and
> either positional or keyword; d required keyword
>
> def foo(a, b=1, /, c=1, *, d=1): ... # same, but b, c, d optional
>
> That about covers it. But agreed it's no thing of beauty, so let's abandon it.
>
And I was just starting to like it, too. :(
Personally, I don't see it as any uglier than having the lone '*' in the
signature; although, I don't see lone '*'s all that much, whereas the
'/' could be quite prevalent.
Is this something we want? We could have a built-in decorator, like
property or staticmethod, to make the changes for us (each
implementation would have to supply their own, of course):
@positional(2)
def foo(a, b)
Or we could use brackets or more parentheses:
def foo([a, b])
def foo((a, b))
That doesn't seem too bad...
def foo((a, b=1), c=2, *, d=3)
Since tuple-unpacking no longer happens in the definition signature, we
don't need the leading * before the parentheses.
Just my last two cents (unless the idea garners encouragement, of course ;).
~Ethan~
More information about the Python-ideas
mailing list