Ast . expr类型的最后解析



有一些我不理解的是由最后一个模块计算的线性偏移量。通常当我得到最后一个物体的直线时,它会给出这个物体遇到的第一行。

例如在下面的例子中,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)相对应的源文本范围。

相关内容

  • 没有找到相关文章

最新更新