Python中的所有小EBNF规则是否可以组合成一个更大的正确规则?

Can all small EBNF rules in Python be composed into a larger correct one?

我发现了这个规则here,我只是没有弄清楚"*" or_exprstarred_item是如何等价的。如果没有错,是什么问题导致的我的代码 a = 8;b = 2; *(a >> b), = (1,2,3) 引发异常,它说 "SyntaxError: can't assign to operator"?

Python 中的归因 - 发生在赋值运算符 = 或扩充运算符之一(+=-=、...)实际上是一个语句,并且不能像在 C 语法派生语言中那样用作普通表达式的一部分。

赋值的左边部分必须作为变量名(或名称序列)有意义。

你试图在那里使用的表达式 *a >> b, = (1,2,3) (我承认我无法理解你想要实现的目标)相当于一个序列,第一个(也是唯一的)元素是 *a >> b - 在 Python 中也不是有效名称 - 因此你的错误。

assignemnts 中的“*a”表示任何 "is left of" 在归因于名称序列的其他部分之后的任何长度都分配给加星标的名称:

In [3]: *a, b = (1, 2, 3)

In [4]: a
Out[4]: [1, 2]

In [5]: b
Out[5]: 3

这是确定性的,只要出现 * 就有效:

In [6]: a, b, *c, d = range(10)

In [7]: [a, b, c, d]
Out[7]: [0, 1, [2, 3, 4, 5, 6, 7, 8], 9]

当然,如果有人试图使用两颗星,则会由于歧义而导致错误:

In [8]: *a, *b, c = range(5)
  File "<ipython-input-8-e75ad61b842a>", line 1
    *a, *b, c = range(5)
                        ^
SyntaxError: two starred expressions in assignment

再次注意,在任何情况下都不允许在属性运算符的左侧使用任意表达式。

在非赋值表达式上,* 运算符可用于扩展可迭代对象。在 Python 3.5 之前,这只能在函数调用中实现 - 现在可以在任何需要一系列文字的地方使用:

In [9]: a = 0, *range(10, 12), 2

In [10]: a
Out[10]: (0, 10, 11, 2)