The relevant section from the Python3 documentation:
funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")"
["->" expression] ":" suite
decorators ::= decorator+
decorator ::= "@" assignment_expression NEWLINE
dotted_name ::= identifier ("." identifier)*
parameter_list ::= defparameter ("," defparameter)* "," "/" ["," [parameter_list_no_posonly]]
| parameter_list_no_posonly
parameter_list_no_posonly ::= defparameter ("," defparameter)* ["," [parameter_list_starargs]]
| parameter_list_starargs
parameter_list_starargs ::= "*" [parameter] ("," defparameter)* ["," ["**" parameter [","]]]
| "**" parameter [","]
parameter ::= identifier [":" expression]
defparameter ::= parameter ["=" expression]
funcname ::= identifier
My understanding of EBNF is that the above grammar for parameter_list
requires the "," and "/" characters, since they appear alone and aren't wrapped in []
or followed by a *
. Obviously they aren't actually required, and Python is perfectly happy to accept basic function definitions like def say_hello(input_name)
, so is this a mistake in the documentation, or have I misunderstood how to read the grammar?
question from:
https://stackoverflow.com/questions/65905565/why-does-the-grammar-for-function-definitions-in-the-python3-documentation-seem 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…