对于由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。
答案 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)。