On Tue, Feb 28, 2017 at 10:17:31PM +0100, Victor Stinner wrote:
My question is: would it make sense to implement this feature [positional only parameters] in Python directly?
+0 on positional-only parameters.
If yes, what should be the syntax? Use "/" marker?
I think that / makes a nice pun with * and is easy to remember.
I dislike the proposed double-leading-only underscore convention, as that makes the names look like private parameters the caller shouldn't provide at all. And it leads to confusion:
def function(__a, b, _c, * __d): ...
So __a is positional-only, b could be positional or keyword, _c is private, and __d is keyword-only but just happens to start with two underscores. Yuck.
I think that [...] is completely unacceptable. It is a very common convention to use square brackets to flag optional arguments when writing function signatures in documentation, e.g.:
Help on class zip in module builtins: class zip(object) | zip(iter1 [,iter2 [...]]) --> zip object
It would be confusing to have [...] have syntactic meaning different to that convention.
Use the @positional() decorator?
I suppose a positional() decorator would be useful for backporting, but I wouldn't want it to be the One Obvious Way to get positional arguments.
By the way, I read that "/" marker is unknown by almost all Python developers,
Of course it is not well known -- it is only new, and not legal syntax yet! Unless they are heavily using Argument Clinic they probably won't recognise it.
and [...] syntax should be preferred, but inspect.signature() doesn't support this syntax. Maybe we should fix signature() and use [...] format instead?
Replace "replace(self, old, new, count=-1, /)" with "replace(self, old, new[, count=-1])" (or maybe even not document the default value?).
That isn't right. It would have to be:
replace([self, old, new, count=-1])
if all of the arguments are positional-only. But that makes it look like they are all optional! A very strong -1 to this.
Python 3.5 help (docstring) uses "S.replace(old, new[, count])".
S.replace(old, new[, count], /)
which shows that all three arguments are positional only, but only count is optional.