Python 语言参考和函数定义

Python Language Reference And Function Definitions

据我了解,python 语言参考是以扩展 BNF 格式编写的。在查看函数定义文档时,我注意到该规范似乎不支持使用尾随 *args 或 **kwargs 参数。

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

参见:https://docs.python.org/3/reference/compound_stmts.html#grammar-token-defparameter

然而当我像这样定义函数时:

def func(arg1, *args, **args):

python解释器认为是合法的。

我错过了什么?从规范看来,您必须在函数定义的开头有 * 在任何其他参数之前。

这似乎是一个文档错误,已针对该错误提出 an issue

我认为文档中的定义略有简化,以便于阅读。 "real" 定义在 full grammar specification:

中给出
funcdef: 'def' NAME parameters ['->' test] ':' suite
parameters: '(' [typedargslist] ')'
typedargslist: (tfpdef ['=' test] (',' tfpdef ['=' test])* [','
       ['*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' tfpdef]]
     |  '*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' tfpdef)
tfpdef: NAME [':' test]

这更难阅读,但似乎正确地允许带有或不带有普通参数的可变参数。