2013-01-16 70 views
1

我正在使用_ast進行一些代碼分析,並遇到導入函數的名稱時遇到問題。
假設我的代碼文件(code.py)看起來是這樣的:`_ast`中導入函數的名稱

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

它在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' 
+0

啊!非常感謝。這讓我瘋狂。 PS:感謝'vars'(以前不知道) – inspectorG4dget