1

我最近一直在学习*args**kwargs使用python,我发现在python 3中可以使用bare *,如标题中的示例所示,表示它之后不允许使用位置参数。

问题是我看不到它如何匹配参考中的正式定义或“参数列表。参数列表的定义如下:

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 不太正确?

4

1 回答 1

4

您正在查看的语法部分描述了函数调用。而且在函数调用中,bare*确实是无效的。

函数定义语法在语言参考的另一部分。这些产品是相关的:

parameter_list ::=  (defparameter ",")*
                    ( "*" [parameter] ("," defparameter)* ["," "**" parameter]
                    | "**" parameter
                    | defparameter [","] )
parameter      ::=  identifier [":" expression]
defparameter   ::=  parameter ["=" expression]

请注意,这里parameter的 s 和在 .defparameters之后是可选的*

抱怨的错误def f(*)并非def f(*, **kwds)来自语法。就语法而言,它是合法的,并且解析成功。只有在 AST 生成期间,才会检测到这一点并将其标记为错误。这不是语法中唯一未处理的语法约束。

于 2013-07-10T23:08:19.670 回答