Python AST:多个语义不清晰,例如expr_context

5 投票
2 回答
1452 浏览
提问于 2025-04-16 21:25

有没有比ast文档更多关于ast模块的信息呢?

特别是,我想知道expr_context(以及它所有可能的值)到底是什么意思。

还有,AssignAugAssign有什么区别呢?

另外,在给一个局部变量赋值时,能不能直接引用一个真实的Python对象,而不是它的名字?我正在自己构建一个抽象语法树(AST),我有一些Python对象想在AST中访问。另一种方法是给它们引入一些临时的虚拟变量名,然后把这些虚拟变量名添加到globals()的作用域中,以便后面编译的函数使用,但我觉得这样做有点不太好(慢而且不太优雅)。

2 个回答

2

你可以通过使用 Str(s=) 或 Num(n=) 的方式,把一个真实的 Python 对象“偷偷带入”抽象语法树(AST)中。举个例子,下面的代码就是通过替换一个字符串,直接传递了一个函数对象。

import ast

data = '''
x = '1234'
x()
'''
def testfunc():
    print "inside test function"
tree = compile(data, '<string>', 'exec', ast.PyCF_ONLY_AST)

class ModVisitor(ast.NodeVisitor):
    def visit(self, node):
        if isinstance(node, ast.Str):
            node.s = testfunc
        self.generic_visit(node)

ModVisitor().visit(tree)

code = compile(tree, '<string>', 'exec')
exec code # prints "inside test function"

注意:我在 Python 2.7 中测试过这个。我不确定这个方法在更早或更晚的版本中是否也适用。

11

我来试着自己回答一下。

经过一些测试和猜测:

expr_context 是定义 Name 的地方,比如说它是在赋值的左边(Store, AugStore),右边(Load, AugLoad),在一个 del 语句中(Del),或者在像 FunctionDefLambda 这样的参数列表中(Param)。

AugAssign 就像是 a = a <op> b,而 Assign 只是简单的 a = b

我还没有找到引用真实 Python 对象的方法,看起来是没有的。

撰写回答