据我了解,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解释器认为它是合法的。
我错过了什么?从规范看来,在任何其他参数之前,您必须在函数定义的开头有*。
答案 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。