12

http://docs.python.org/2/reference/expressions.html#operator-precedence

私の推測では、dict ルックアップの上のバケットの 1 つに分類されます。

func(*mydict[mykey])

最初に辞書検索を行います。Python での操作の順序について詳しく説明している、最初のリンクよりも優れたグラフはありますか?

4

2 に答える 2

8

アンパック*はオペレーターではありません。これは呼び出し構文の一部です。Callsの下に定義されており、次のことがわかります。

["," "*" expression]

… はargument_list、2 つの異なる場所で の一部になることができます。(セマンティクスは、「さらに定位置があれば…」および「構文が…」で始まる段落で説明されています。)

したがって、任意のexpression. expression直接の引数としてフルを受け取る演算子がないことがわかります。したがって、演算子をゆるく考えたい場合は*、どの演算子よりもゆるくバインドします。ただし、実際には演算子ではないことに注意してください。

また、これはすべて Python 3.x で変更されたことにも注意してください。しかし、基本的な考え方は同じです。引数のアンパックと代入のアンパックは両方ともexpression、 だけでなく を使用するため、大まかに言えば、すべてが aまたはより具体的なもの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終わることがわかります。starargsCall

このastモジュールは、リファレンス マニュアルに記載されているものではなく、抽象文法を使用しています。物事にはさまざまな名前が付けられており、文法の一部と見なされているものの、実際にはパーサーよりも高いレベルで行われているものなどは処理されませんが、一方で、理解するのははるかに簡単です。一斉に。exprに使用されるstarargsが になることがわかりますSubscript

于 2013-10-22T18:34:31.087 に答える