Ast解析ast.Expr类型

时间:2015-05-26 23:55:59

标签: python abstract-syntax-tree expr

对于由ast模块计算的lineno偏移量,我有些不明白的地方。通常当我得到某个ast对象的lineno时,它会给我第一行遇到的对象。

例如在下面的例子中,foo的lin

st='def foo():\n    print "hello"'
import ast
print ast.parse(st).body[0].lineno 
print ast.parse(st).body[0].body[0].lineno

将为函数foo返回 1 ,并为hello world printout返回 2

但是,如果我解析多行文档字符串(ast.Expr),则提供的lineno是最后一行。

st='def foo():\n    """\n    Test\n    """'   
import ast
print ast.parse(st).body[0].lineno 
print ast.parse(st).body[0].body[0].lineno

对于该函数,结果仍然是 1 ,但对于docstring,它的行 4 。我原以为它会在线 2 ,因为这是docstring开始的时候。

我想我要问的是,是否有办法始终获得所有ast对象的第一行,包括ast.Expr。

1 个答案:

答案 0 :(得分:0)

AST的源位置还有很多不足之处,但ASTTokens库可以提供很多源代码,它可以使用更有用的位置信息来注释AST节点。在您的示例中:

import asttokens
st='def foo():\n    """\n    Test\n    """'
atok = asttokens.ASTTokens(st, parse=True)

print atok.tree.body[0].first_token.start[0]
print atok.tree.body[0].body[0].first_token.start[0]

根据需要打印 1 2 。也许更有趣的是,

print atok.get_text_range(atok.tree.body[0])
print atok.get_text_range(atok.tree.body[0].body[0])

打印与节点对应的源文本范围:在这种情况下为(0,35)和(15,35)。