我正在使用ast解析python文件,我无法弄清楚如何获取ast.Subscript节点进行评估。我甚至无法看到如何从中获取文本(因此我可以使用eval(文本))。谁能看到我错过的东西?
例如,这里A arg的默认值是我要评估的表达式。 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]
答案 0 :(得分:0)
使用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节点由值,切片和ctx组成。第一个切片(["USER"]
)是索引,其值是一个Str节点,第二个([0]
)切片是一个索引,其值是一个Num节点。
您还可以在abstract grammar中看到这一点(请参阅 '切片'类型)。