有一些我不理解的是由最后一个模块计算的线性偏移量。通常当我得到最后一个物体的直线时,它会给出这个物体遇到的第一行。
例如在下面的例子中,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
将返回1对于函数foo,返回2对于hello world打印输出
但是,如果我解析多行文档字符串(ast.Expr),则提供的行号是最后一行。
st='def foo():n """n Testn """'
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。
AST的源代码位置还有很多需要改进的地方,但是ASTTokens库提供了很多需要改进的地方,该库用更有用的位置信息注释了AST节点。在您的示例中:
import asttokens
st='def foo():n """n Testn """'
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)相对应的源文本范围。