python/ast: 评估 ast.Subscript 节点
我正在使用 ast 来解析 Python 文件,但我不知道怎么让 ast.Subscript 节点进行计算。我甚至不知道怎么从中提取文本(这样我就可以用 eval(text) 来执行)。有没有人能告诉我我漏掉了什么?
举个例子,这里 A 参数的默认值是一个我想要计算的表达式。Ast 返回的默认值是一个 ast.Subscript 节点。我该怎么计算它呢?
import ast
import os
text = """
def test(A=os.environ["USER"][0]):
return A
"""
fnDef = ast.parse(text).body[0]
argDefault = fnDef.args.defaults[0]
1 个回答
1
使用 ast.dump(node)
,你可以查看你的节点是由什么组成的。在你的例子中(缩进是我加的):
print(ast.dump(fnDef))
> FunctionDef(name='test',
args=arguments(
args=[arg(arg='A', annotation=None)],
vararg=None,
varargannotation=None,
kwonlyargs=[],
kwarg=None,
kwargannotation=None,
defaults=[
Subscript(
value=Subscript(
value=Attribute(
value=Name(id='os', ctx=Load()),
attr='environ', ctx=Load()),
slice=Index(value=Str(s='USER')),
ctx=Load()),
slice=Index(value=Num(n=0)),
ctx=Load())],
kw_defaults=[]),
body=[Return(value=Name(id='A', ctx=Load()))],
decorator_list=[],
returns=None)
从中可以看到,你的下标节点(Subscript nodes)由一个值、一个切片和一个上下文(ctx)组成。第一个切片(["USER"]
)是一个索引(Index),它的值是一个字符串节点(Str node);第二个切片([0]
)也是一个索引,它的值是一个数字节点(Num node)。
你还可以看到在抽象语法中(查看'slice'类型)。