在函数定义中,参数的正式语法如下:(参考链接)
显然,人们可以认为一个形如
parameter_list ::= (defparameter ",")* #[1]
| "*" [parameter] ("," defparameter)* ["," "**" parameter] #[2]
| "**" parameter #[3]
| defparameter [","] ) #[4]
(为了更清楚,我添加了#[num]
)
我无法看出它如何与下面的函数定义完全匹配:
def foo(a, *, b=10): pass
显然,人们可以认为一个形如
def foo(a, *, b=10)
的定义属于规则#[2]
,该规则允许使用*
符号来分隔仅限关键字参数。但是对于foo
函数的规则,我认为应该结合#[1]
和#[2]
两个规则:parameter_list ::= (defparameter ",")* "*" [parameter] ("," defparameter)* ["," "**" parameter]
由于规则#[1]
和#[2]
本身似乎不能单独匹配该情况。
我在这里漏掉了什么?
def foo(*, a, b=10)
的形式是不合法的,对吗? - Dimitris Fasarakis Hilliard