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]
这更难阅读,但似乎正确地允许带有或不带有普通参数的可变参数。
据我了解,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]
这更难阅读,但似乎正确地允许带有或不带有普通参数的可变参数。