On 20 September 2012 16:14, Benjamin Peterson <benjamin@python.org> wrote:
2012/9/20 Mark Dickinson <dickinsm@gmail.com>:
> 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".

Why not?

>>> def f(a, b, c=3): pass
>>> f()
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.:


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
>>>> f()
>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?).