python / ast:评估ast.Subscript节点

时间:2014-05-08 18:45:21

标签: python abstract-syntax-tree

我正在使用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]

1 个答案:

答案 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中看到这一点(请参阅 '切片'类型)。