Python语言参考和函数定义

时间:2015-03-05 19:52:54

标签: python bnf ebnf

据我了解,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时:

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

python解释器认为它是合法的。

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

1 个答案:

答案 0 :(得分:1)

它似乎是一个文档错误,an issue已被提出。

我认为文档中的定义略有简化,以便于阅读。 "真实"定义在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]

这更难以阅读,但似乎正确允许有或没有普通参数的varargs。