<p>包含节点子节点的附件取决于节点所表示的语法类型。每个节点类也有一个特殊的<code>_fields</code>属性,该属性列出了类所具有的子节点的属性名。例如</p>
<pre><code>>>> ast.parse('5+a')
<_ast.Module object at 0x02C1F730>
>>> ast.parse('5+a').body
[<_ast.Expr object at 0x02C1FF50>]
>>> ast.parse('5+a').body[0]
<_ast.Expr object at 0x02C1FBF0>
>>> ast.parse('5+a').body[0]._fields
('value',)
>>> ast.parse('5+a').body[0].value
<_ast.BinOp object at 0x02C1FF90>
>>> ast.parse('5+a').body[0].value._fields
('left', 'op', 'right')
>>> ast.parse('5+a').body[0].value.left
<_ast.Num object at 0x02C1FB70>
</code></pre>
<p>等等。在</p>
<p><em>编辑,以澄清发生的事情</em></p>
<p>在继续之前,请先浏览一下<a href="http://docs.python.org/library/ast.html#abstract-grammar" rel="nofollow">CPython Abstract Grammar</a></p>
<p>考虑:</p>
^{pr2}$
<p>实际上,如果你看一下语法,第一个产生式规则是针对模块的。它似乎需要一系列语句,作为一个名为body的参数。在</p>
<pre><code>>>> ast.parse('5+a')._fields
('body',)
>>> ast.parse('5+a').body
[<_ast.Expr object at 0x02E965B0>]
</code></pre>
<p>AST的<code>_fields</code>属性只是“body”,body属性是一系列AST节点。回到语法,在<code>stmt</code>的产生式规则中,我们看到<code>Expr</code>使用一个名为<code>value</code>的表达式</p>
<pre><code>>>> ast.parse('5+a').body[0].value
<_ast.BinOp object at 0x02E96330>
</code></pre>
<p>如果我们查找BinOp的定义,我们会发现它有3个不同的参数,left、op和right。我希望你能从那里开始。在</p>