在Python中,可以同时给多个变量赋值:
a, b = 1, 2
a, b = b, a
同时,在声明函数时,允许指定默认值:
def myfunc(a, b=0):
return a+b
原来“逗号”运算符在第一种情况下的优先级高于赋值运算符,而在第二种情况下赋值运算符的优先级更高?在这种情况下,运算符优先级实际上是如何计算的,如果可能的话,你能告诉我(大概)这种变量优先级是如何在 Python 中实现的吗?
PS。为什么需要这个:我正在为应用程序开发一种宏语言(为此,为了不重新发明轮子,我以其他语言为例),并且我想实现批量分配和默认参数。为此,我需要确定运算符的优先级,并以某种方式解决这个问题:我不想硬编码,为逗号设置变量优先级,检查它是否在括号中,这会使解析器代码复杂化并使其不便于进一步扩展。
逗号不是 Python 中的运算符(即问题从一开始就提出错误 - 不存在运算符优先级的问题)。它只是赋值操作中的句法分隔符。换句话说,Python 编译器根据语言的语法转换表达式
in(请参阅下面的评论以获取来自@CrazyElf 的有用修复!)
如同
这只是一个缩写:
我认为说编译器最初进行语法定义的更改是正确的,然后才继续处理优先级问题。
让我澄清一下,根据文档*,将令牌流提供给解析器的输入,因此必须由它执行这些转换。令牌流本身不包含考虑的转换。为了清楚起见,一个带有标记化结果的示例
下面给出。
如果您直接对构建 AST 树感兴趣,那么使用标准 ast 模块会很方便。我们的示例的结果(我们可以看到@CrazyElf 关于元组是绝对正确的):
这是一个关于使用 AST 和字节码的有趣链接:https ://habr.com/ru/company/piter/blog/493424/
这是标记化和构建 ast 树的代码:
* https://python.readthedocs.io/en/stable/reference/lexical_analysis.html#index-0中的第一行
我决定,在我的宏语言中,使用“=”对变量进行批量赋值:
而对于参数的默认值——Pascal 运算符“:=”,赋予它最高优先级:
尽管我自己回答了这个事实,但我还是将正确的答案提供给了用户 Sergey,因为它更完整、信息丰富且实用。