On 20 September 2012 16:14, Benjamin Peterson email@example.com wrote:
2012/9/20 Mark Dickinson firstname.lastname@example.org:
And excepting optional ones, too, right? E.g., the c in
def foo(a, b, c=1, *args, d): pass
can be passed to by position, but isn't "positional".
def f(a, b, c=3): pass
Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: f() missing 2 required positional arguments: 'a' and 'b'
f(1, 2, 3, 4)
Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: f() takes from 2 to 3 positional arguments but 4 were given
The difference between c and a,b is that c is optional, whereas a and b are required.
In Python 2.x there are named arguments and variadic arguments. There are two types of named arguments: required and optional. There are also two types of variadic arguments: positional and keyword. i.e.:
named required not-required variadic positional keyword
In Python 2.x all named parameters can be passed by position or by keyword, so it doesn't make sense to use those concepts to distinguish them. On the other hand, for variadic parameters that distinction is crucial.
In Python 3.x there are two orthogonal properties for each named parameter. The parameter can be required or optional as before, and then the parameter can be keyword-only or positional. There are 4 combinations of these two properties:
def f(a, b=1, *, c, d=3): pass
| required | optional positional | a | b kwonly | c | d
Since there are two orthogonal properties of a parameter (requiredness and positionness) it makes perfect sense to use two adjectives to describe each parameter as is the case for the error message shown at the start of this thread:
Mark Dickinson wrote:
def f(x): pass
Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: f() missing 1 required positional argument: 'x'
I would say that the only problem with this terminology is that it would be good to think of a word to replace "keyword-only" (positionless?).