【问题标题】:Can all small EBNF rules in Python be composed into a larger correct one?Python中所有小的EBNF规则可以组合成一个更大的正确规则吗?
【发布时间】:2016-12-11 10:37:37
【问题描述】:

我发现这条规则here,我只是不知道"*" or_expr 是如何等同于starred_item 的。如果没有错,是什么问题导致我的代码a = 8;b = 2; *(a >> b), = (1,2,3) 引发了异常,上面写着“SyntaxError: can't assign to operator”?

【问题讨论】:

  • 你甚至希望这个语句发生什么?
  • 该代码没有意义,因此它引发SyntaxError 是完全可以理解的。 OTOH,*a, = 1, 2, 3 有效(在最新版本的 Python 中)。
  • 我在研究Python表达式的语法。我从规定的规则中导出了规则`*(identifier ">>" identifier)`,归类为starred_expression。元组或列表都可以出现在简单赋值的左侧,` *(identifier ">>" identifier),` 也可以。但是我没有得到正确的结果。

标签: python python-3.x syntax ebnf


【解决方案1】:

Python 中的归因 - 赋值运算符 = 或扩充运算符之一(+=-=、...)实际上是一个语句,不能用作C 语法派生语言中的正常表达式。

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

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

assignemnts 中的“*a”表示在归属于名称序列的其他部分之后“剩余”的任何长度都将分配给带星号的名称:

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)

【讨论】:

  • 我知道这个结论,是PEP-3132介绍的。
  • 我找到了assignment statements的EBNF规则,解释了我的情况并确认了你的回答。
猜你喜欢
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
相关资源
最近更新 更多