[Python-Dev] Python Call Mechanism
Michael Hudson
mwh21@cam.ac.uk
02 Nov 2000 17:29:52 +0000
Michael Hudson <mwh21@cam.ac.uk> writes:
> Guido van Rossum <guido@python.org> writes:
>
> Then the following could be made essentially equivalent:
>
> f(a,b,c=d,e=f)
>
> dict = {c:d,e:f}
> f(a,b,**dict)
... except when you have stuff like
f(a,b=c,**kw)
Gruntle. Maybe Python function calls are just complicated! (Has
anyone looked at bytecodehacks.xapply? - and that doesn't even handle
*-ed and **-ed arguments...).
Hmm - the interaction of "a=b" style args & *-ed args is a bit
counter-intuitive, particularly as the "a=b" args syntatically have to
come before the *-ed args:
>>> def f(a,b,c,d):
... return a,b,c,d
...
>>> f(1,c=3,*(2,4))
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: keyword parameter 'c' redefined in call to f()
>>> f(1,b=3,*(2,4))
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: keyword parameter 'b' redefined in call to f()
>>> f(1,d=4,*(2,3))
(1, 2, 3, 4)
I humbly submit that This Is Wrong. I haven't seen anybody complain
about it, which suggests to me that noone is using this combination,
and I propose either:
1) banning it
2) demanding that the *-ed arg precede the "a=b" args
Of course, if noone is using this "feature", then maybe this dusty
little corner of the language should be left undisturbed.
And I haven't even thought about default arguments yet...
about-to-make-an-opcode-called-BODGE_KEYWORD_ARGUMENTS-ly y'rs
M.
--
nonono, while we're making wild conjectures about the behavior
of completely irrelevant tasks, we must not also make serious
mistakes, or the data might suddenly become statistically valid.
-- Erik Naggum, comp.lang.lisp