[Python-bugs-list] [ python-Bugs-798652 ] Clarify trailing comma in
func arg list
SourceForge.net
noreply at sourceforge.net
Sat Sep 6 15:42:06 EDT 2003
Bugs item #798652, was opened at 2003-09-01 09:32
Message generated for change (Comment added) made by bcannon
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=798652&group_id=5470
Category: Documentation
Group: None
Status: Open
Resolution: None
Priority: 5
Submitted By: Terry J. Reedy (tjreedy)
>Assigned to: Fred L. Drake, Jr. (fdrake)
Summary: Clarify trailing comma in func arg list
Initial Comment:
Current Ref Man 5.3.4 Calls says after grammar:
"A trailing comma may be present after an argument
list but does not affect the semantics. "
But this is not true if arg list ends with *expr or **expr:
>>> dict(*l,) # any function will do since not called
File "<stdin>", line 1
dict(*l,)
^ # points at ')'
SyntaxError: invalid syntax
>>> dict(**d,)
File "<stdin>", line 1
dict(**d,)
^ # points at ','
SyntaxError: invalid syntax
Suggestion: "If an argument list does *not* end with
*expr or **expr, a trailing comma may be added
without affecting the semantics."
The same exception applies to function defs as well as
calls, but 7.5 Function definitions does not have a
statement such as above. However, the production for
parameter_list does end with 'defparameter [","]'. I
suggest that this be the first of the parenthesized
alternatives, as it logically should be, rather than the
last, so it flows better and so that no one (ignorant
that '[]' binds tighter than '|') could possible think that
the '[,]' applies to the * and ** parts. IE: change
parameter_list ::= (defparameter ",")*
("*" identifier [, "**" identifier]
| "**" identifier | defparameter [","])
to
parameter_list ::= (defparameter ",")*
(defparameter [","]
|'*' identifier [, "**" identifier]
| "**" identifier)
Squeezing out a line is a suboptimazation.
----------------------------------------------------------------------
>Comment By: Brett Cannon (bcannon)
Date: 2003-09-06 14:42
Message:
Logged In: YES
user_id=357491
Terry is right that the line is wrong. You can examine the actual
Grammar/Grammar file to see that:
varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**'
NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
As you can see the actual grammar does not even have the
definition of a 'call' token. Not only that, but the example in the
docs is not entirely correct since is says that the * and ** syntax
take an 'expression' token which in the grammar in the docs is
basically a tuple-like syntax while the official grammar wants a
NAME which is defined as a primitive token.
I don't know how extensive of a change is warranted. That one
line does need to be changed, but if *only* that line is changed
then the text won't match the example grammar. But since the
example grammar does not mirror the real grammar I don't want
to go messing with it without Fred weighing in on this.
I am going to assign to Fred to see what he has to say.
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=798652&group_id=5470
More information about the Python-bugs-list
mailing list