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
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com