[Python-Dev] funcdef grammar production

Jewett, Jim J jim.jewett at eds.com
Mon Mar 15 14:23:04 EST 2004


PEP 318 is likely to change the BNF productions for funcdef,
so I was taking a look at what is there right now.

  funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite
  parameter_list ::= (defparameter ",")*
                        ("*" identifier [, "**" identifier] |
				 "**" identifier | defparameter [","])
  defparameter ::= parameter ["=" expression]
  sublist ::= parameter ("," parameter)* [","]
  parameter ::= identifier | "(" sublist ")"
  funcname ::= identifier

But the text points out that no purely positional (without a 
default value) arguments can occur after any keyword arguments.
Is there a reason not to include this in the BNF?

(Assuming the other productions are unchanged,) this seems to work:

  parameter_list ::=  starparameter  |
                      defparameter ("," defparameter)* ["," [starparameter]]
|
                      parameter ("," parameter)* ("," defparameter)* [","
[starparameter]]

  starparameter ::= "*" identifier [, "**" identifier] | 
                    "**" identifier

  defparameter ::= parameter "=" expression

starparameter was separated out because a trailing comma is permitted
after a positional or default parameter, but not after *args or **kwargs.

Is there some technical reason not to do this?  For instance, is the
doco autogenerated from the actual code?  Is it somehow cheaper to
check for an optional first parameter than for three possibilities?

-jJ



More information about the Python-Dev mailing list