python中的定义foo(*,a = 1)如何与文档引用中的正式“参数列表”匹配?

时间:2013-07-10 23:01:57

标签: python python-3.x grammar

我最近在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不太正确吗?

1 个答案:

答案 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,并将其标记为错误。这不是语法中没有处理的唯一语法约束。