[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