[Of the first part]
line 19 is
action(progress=progress, *args)
where the args is a tuple
args = (i, 3)
and the function is defined as
def action(id, reps, progress):
In documents 4.7.2. Keyword Arguments, it says
'''
def parrot(voltage, state='a stiff', action='voom', type='Norwegian
Blue'):
...
...
but all the following calls would be invalid:
...
parrot(voltage=5.0, 'dead') # non-keyword argument after a keyword
argument
...
'''
After unpack the args in line 19, it will be looks like
action(progress=progress, i, 3)
and it seems violate the above rule.
[Of the second part]
> The "*args" and "**kw" are very helpfull. I hope (and expect)
> they will remain.
There is no "**kw" involved in this topic:-) and the positional limit of
"*args" in a function definitions has its own good reason:-)
IMHO, there is no reason to check the *args has to appear at last in
positional argument list in a function call because of there is no
"unknown number of parameters" at the time of unpacking. It should be
alright to write line 19
action(*args, progress)
just like assignment below where both are valid.
a, *b = any
*a, b = any
Best Regards,
Jach Fong
dieter at 2018/6/13 PM 12:59 wrote:
Jach Fong <jf...@ms4.hinet.net> writes:
...
4.7.4. Unpacking Argument Lists
The reverse situation occurs when the arguments are already in a list or
tuple but need to be unpacked for a function call requiring separate
positional arguments.
...
args = [3, 6]
list(range(*args))
"""
I can't understand why line 19 works?
Not sure what "line 19" is - but if it refers to the example above:
"range" accepts (among others) 2 integer arguments.
The "*args" above means: unpack the sequence in "args" into
individual arguments.
This means (with the values of the example above),
that "range(*args)" is equivalent to "range(3, 6)".
Didn't it violate the rule of
"# non-keyword argument after a keyword argument"?
No keyword arguments at all in the above example.
and why a more
reasonable look syntax gets an error?
action(*args, progress)
^
SyntaxError: only named arguments may follow *expression File
"test.py", line 19
This is (in my view) a somewhat arbitrary restriction -- maybe
introduced for symmetry with the function definition syntax.
The message is quite clear, however: after the "*arg",
you must pass keyword arguments only, i.e. they must have
the form "param=value".
The only reason I can guess is that it checks with the rule in 4.7.3
which is really unrelated. The "*any" notation used in different places
with different meaning, such as defining arbitrary argument, unpacking
argument or even in an assignment(a,*b=any). Maybe it will be better to
stop this syntax checking and lets both statements below valid:-)
The "*args" and "**kw" are very helpfull. I hope (and expect)
they will remain.
---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus
--
https://mail.python.org/mailman/listinfo/python-list