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? -1 > 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])". Should be: S.replace(old, new[, count], /) which shows that all three arguments are positional only, but only count is optional. -- Steve _______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/