`_ast`中导入函数的名称

时间:2013-01-16 16:33:29

标签: python import abstract-syntax-tree

我正在使用_ast进行一些代码分析,并且在获取导入函数的名称时遇到了问题。
假设我的代码文件(code.py)如下所示:

import somemod
def foo():
    somemod.bar()

当我使用root = compile(open('codefile.py').read(), 'codefile.py', 'exec', _ast.PyCF_ONLY_AST)获取此文件的ast时,我可以像这样调用somemod.bar行:

root.body[1].body[0]

这是一个_ast.Expr节点 然后,我期望能够通过查看此节点获得somemod.bar。但是,当我查看root.body[1].body[0].value.func.value.id时,我会得到somemod。据我所知,我无法找到获取barsomemod.bar

的方法

我错过了什么?我怎样才能到达bar

1 个答案:

答案 0 :(得分:1)

它位于value.func.attr

>>> root = compile(open('codefile.py').read(), 'codefile.py', 'exec', _ast.PyCF_ONLY_AST)
>>> root.body[1].body[0].value.func
<_ast.Attribute object at 0x9703acc>
>>> f = root.body[1].body[0].value.func
>>> vars(f)
{'col_offset': 4, 'ctx': <_ast.Load object at 0xb6e2c6cc>, 'attr': 'bar', 'value': <_ast.Name object at 0x9703a8c>, 'lineno': 3}
>>> f.attr
'bar'
>>> f.value.id
'somemod'