我最近在python中学习了*args
和**kwargs
,我在python 3中遇到过,可以使用裸*
,如标题中的示例所示在它之后不允许任何位置参数。
问题是我看不出它与正式定义或'参数列表'in reference的匹配程度。 参数列表有以下定义:
argument_list ::= positional_arguments ["," keyword_arguments]
["," "*" expression] ["," keyword_arguments]
["," "**" expression]
| keyword_arguments ["," "*" expression]
["," keyword_arguments] ["," "**" expression]
| "*" expression ["," keyword_arguments] ["," "**" expression]
| "**" expression
我认为它有效的唯一方法是expression
为空,但我看不出它是如何发生的。
如果我们假设expression
可以为空,则以下定义应该有效:
def foo(*)
def bar(*,**kwargs)
这些定义没有意义,因为*
之后需要关键字参数。
所以我很感激有关这个问题的任何澄清。我错过了什么?或者上面的BNF不太正确吗?
答案 0 :(得分:4)
您正在查看的语法部分描述了函数调用。在函数调用中,裸*
确实无效。
function definition grammar是语言参考的另一部分。这些作品是相关的:
parameter_list ::= (defparameter ",")*
( "*" [parameter] ("," defparameter)* ["," "**" parameter]
| "**" parameter
| defparameter [","] )
parameter ::= identifier [":" expression]
defparameter ::= parameter ["=" expression]
请注意,在parameter
之后,defparameters
和*
是可选的。
抱怨def f(*)
和def f(*, **kwds)
的错误并非来自语法。就语法而言,它是合法的,并且被成功解析。仅检测到during AST generation,并将其标记为错误。这不是语法中没有处理的唯一语法约束。