On 9/20/2012 7:56 AM, Mark Dickinson wrote:
I suspect I've missed the boat on this one (certainly for 3.3.0), but here goes. The new TypeError reporting for bad function calls is a huge improvement (thanks Benjamin!), but I have one small nitpick: what *is* a positional argument? For example:
>>> 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 think it's confusing to describe 'x' as a positional argument. It's a required formal parameter, certainly. But a caller of 'f' could pass 'x' either by position or by 'keyword'.
When running training (generally Python 2.6 or 2.7 based), I frequently have to devote some time to unravelling student confusion between 'arguments passed by keyword' on one hand and 'optional formal parameters' on the other. The outline of the explanation goes something like:
(0) Preamble: be careful to separate out details of function calling from those of function definition; distinguish formal parameters from actual arguments. (1) On the function *definition* side, formal parameters may be either *required* or *optional*.
and optional params may or may not have an overt default object
(2) On the function *calling* side, actual arguments may be passed either positionally or by keyword.
Sometimes position is required, sometimes keyword is required, and usually both are allowed.
(3) The notions in (1) and (2) are entirely orthogonal!
Moreover, all six combinations of passing mode and requirement are possible, although for Python functions, some combinations require setup code in addition to the header. Built-in print accepts an indefinite number of optional no-default position-only args followed by up to three optional defaulted keyword-only args. print() emits the default end='\n'.
(3a) (Although in practice, callers tend to use pass-by-keyword for optional formal parameters.)
That's all for Python 2; Python 3, of course, requires a bit more explanation related to the keyword-only arguments.
There already seems to be a fair amount of confusion in the Python world about point (3);
I have strongly suggested that the docs not adds to the confusion in at least one tracker discussion.
I've seen professional Python training slides that show how to define optional formal parameters under the heading "keyword arguments".
I submit that the word 'positional' in the TypeError message exacerbates this confusion, and that little would be lost by simply dropping it from the exception message.
For this example that would be sufficient, but your later message shows that we need a one-word abbreviations for positional-or-keyword: either something indicating that its default nature -- 'normal', 'standard', 'flexible', 'usual', 'typical' -- or something indicating its dual nature (possibly coined or metaphorical -- 'pos-key', 'bi-mode', 'dual-mode', 'Janus-like'. -- Terry Jan Reedy