[英]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.