在 ast.ImportFrom 中找到 end_lineno

问题描述

在 python 3.8 中执行 ast.parse 时,你会得到一个 end_lineno 变量:

import ast

code_example = 'from typing import List,Dict'
parsed_tree = ast.parse(code_example)

for item in parsed_tree.body:
    print(item.__dict__)

结果:

{
'module': 'typing','names': [<ast.alias object at 0x7fac49c1d2b0>,<ast.alias object at 0x7fac49c1d5e0>],'level': 0,'lineno': 1,'col_offset': 0,'end_lineno': 1,'end_col_offset': 29
}

python3.7中没有end_lineno(和end_col_offset)变量,你如何手动获取

解决方法

在python3.7中没有end_lineno(和end_col_offset)变量,你如何手动获取?

在旧版本中没有检索它们的标准方法,因为这与解析器高度耦合(实际上不是解析器,但对于 3.8/3.9,它是在 ast.c(CST -> AST 转换)中完成的代码)。你可以做的是使用类似 lib2to3 或使用 tokenize (标记从导入语句的开始到下一条语句的开始的源,并找到非空白非-评论最后一个令牌)。