当我使用ast
模块解析源代码时,为什么FormattedValue
中的Name
的lineno
属性设置为1,即使当f字符串不在线时1?抽象语法树中的Python f字符串的行号
我想知道源代码的哪一行被包含在一个函数定义中,所以我正在步行在FunctionDef
节点下方的抽象语法树节点。我将所有lineno
属性收集到一个集合中,并告诉我哪些行是功能定义的一部分。
但是,当Python3.6中出现f-strings时,它们以某种方式破坏了这种技术。这里的问题的一个例子:
import ast
code = """\
f'x{y}'
"""
tree = ast.parse(code)
print(ast.dump(tree, include_attributes=True))
下面是该脚本输出:
Module(body=[Expr(value=JoinedStr(values=[Str(s='x', lineno=2, col_offset=0), FormattedValue(value=Name(id='y', ctx=Load(), lineno=1, col_offset=1), conversion=-1, format_spec=None, lineno=2, col_offset=0)], lineno=2, col_offset=0), lineno=2, col_offset=0)])
我知道这是相当不可读的,所以这里的相同的输出与一些额外的空白:
Module(body=[Expr(value=JoinedStr(values=[
Str(s='x', lineno=2, col_offset=0),
FormattedValue(value=Name(id='y',
ctx=Load(),
lineno=1,
col_offset=1),
conversion=-1,
format_spec=None,
lineno=2,
col_offset=0)], lineno=2, col_offset=0), lineno=2, col_offset=0)])
唯一的源代码是第2行,那么这部分输出是什么?
Name(id='y',
ctx=Load(),
lineno=1,
col_offset=1)
我想这可能是行号内字符串,但是当我尝试这一点,但它仍然报告lineno=1
。
code = """\
f'''
x{y}'''
"""