[英]Where does python argument unpacking fall into the order of operations?
http://docs.python.org/2/reference/expressions.html#operator-precedence
我的猜测是它属于 dict 查找之上的桶之一,因为
func(*mydict[mykey])
首先进行字典查找。 有没有比我的初始链接更好的图表,它更详细地介绍了 Python 中的操作顺序?
解包*
不是运算符; 它是调用语法的一部分。 它在Calls下定义,您可以在其中看到:
["," "*" expression]
... 可以在两个不同的地方成为argument_list
一部分。 (语义在“如果有更多位置……”和“如果语法……”的段落中进行了描述。)
所以它需要任何expression
。 您可以看到没有运算符将完整expression
作为其直接参数。 所以,如果你想松散地考虑*
一个运算符,它比任何运算符都更松散地绑定。 但请记住,它实际上不是运算符。
还要记住,这一切都在 Python 3.x 中改变了。 但基本思想是相同的——参数解包和赋值解包都采用expression
,而不仅仅是primary
,因此松散地说绑定比任何运算符都更松散,它们都采用primary
或更具体的东西。
同时,您可能想尝试在您的代码上运行解析器以查看它的作用:
>>> import ast
>>> tree = ast.parse('func(*mydict[mykey])')
>>> ast.dump(tree)
"Module(body=[Expr(value=Call(func=Name(id='func', ctx=Load()), args=[], keywords=[],
starargs=Subscript(value=Name(id='mydict', ctx=Load()),
slice=Index(value=Name(id='mykey', ctx=Load())), ctx=Load()), kwargs=None))])"
您可以看到整个Subscript
表达式最终作为Call
的starargs
。
ast
模块使用抽象语法而不是参考手册中描述的语法。 它对事物有不同的名称,并且不处理一些被认为是语法的一部分但实际上在比解析器更高的级别上完成的事情,等等——但是,另一方面,它更容易接受一次全部。 您可以看到用于starargs
的expr
可以是Subscript
。
正如 BrenBarn 在评论中提到的,解包被定义为函数调用(Python 2 和 3)和赋值语句(Python 3)的一部分。
所以不,它永远不会成为运算符优先级的一部分,因为它不是运算符。
我怎么知道在这个例子中这不会尝试解压“mydict”? 或者这是语言解析器处理的东西。
在您的示例func(*mydict[mykey])
,函数调用的规范适用。 所以让我们尝试手动解析它。
基本部分与call
的定义匹配,因此*mydict[mykey]
是argument_list
。 在参数列表中,它将被解析为"*" expression
,其中mydict[mykey]
是表达式。 因此,解析器永远不会首先应用解包,因为语法根本没有指定在"*" expression
之后括号中的另一个部分的情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.