Geo*_*Geo 5 python abstract-syntax-tree
我喜欢_ast模块提供的选项,它非常强大.有没有办法从中获取完整的AST?
例如,如果我得到以下代码的AST:
import os
os.listdir(".")
Run Code Online (Sandbox Code Playgroud)
通过使用 :
ast = compile(source_string,"<string>","exec",_ast.PyCF_ONLY_AST)
Run Code Online (Sandbox Code Playgroud)
ast对象的主体将有两个元素,一个导入对象和一个expr对象.但是,我想更进一步,获得导入和listdir的AST,换句话说,我想让_ast下降到可能的最低级别.
我认为这种事情应该是可行的,这是合乎逻辑的.问题是如何?
编辑:在可能的最低级别,我并不意味着访问什么是"可见的".我想获得用于实现listdir的AST :比如可以为它执行的stat和其他函数调用.
你确实以这种方式获得整棵树 - 一直到底部 - 但是,它被保存为一棵树,确切地说......所以在每个级别都要让孩子们必须明确地访问所需的属性.例如(我命名compile结果cf而不是ast因为那会隐藏标准库模块 - 我假设你只有2.5而不是2.6,这就是为什么你使用较低级别的_ast模块呢?)... :
>>> cf.body[0].names[0].name
'os'
Run Code Online (Sandbox Code Playgroud)
这就是告诉你,import语句是进口的名字os(那一个,只是因为1是的长度.names字段.body[0]这是import).
在Python 2.6的模块中,ast您还可以获得帮助,让您更轻松地在树上导航(例如,通过Visitor设计模式) - 但整个树都在2.5(带_ast)或2.5(带ast)中,并且在任何一种情况下以完全相同的方式表示.
为了方便地访问树中的所有节点,在2.6中,使用模块ast(没有前导下划线)和子类ast.NodeVisitor(或者等效地使用ast.iter_child_nodes递归和ast.iter_fields根据需要).当然,_ast如果由于某种原因你被困在2.5中,这些助手可以用纯Python实现.
py> ast._fields
('body',)
py> ast.body
[<_ast.Import object at 0xb7978e8c>, <_ast.Expr object at 0xb7978f0c>]
py> ast.body[1]
<_ast.Expr object at 0xb7978f0c>
py> ast.body[1]._fields
('value',)
py> ast.body[1].value
<_ast.Call object at 0xb7978f2c>
py> ast.body[1].value._fields
('func', 'args', 'keywords', 'starargs', 'kwargs')
py> ast.body[1].value.args
[<_ast.Str object at 0xb7978fac>]
py> ast.body[1].value.args[0]
<_ast.Str object at 0xb7978fac>
py> ast.body[1].value.args[0]._fields
('s',)
py> ast.body[1].value.args[0].s
'.'
Run Code Online (Sandbox Code Playgroud)
HTH
| 归档时间: |
|
| 查看次数: |
2902 次 |
| 最近记录: |