python/ast: 评估 ast.Subscript 节点

1 投票
1 回答
1217 浏览
提问于 2025-04-18 05:53

我正在使用 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'类型)。

撰写回答