Python AST:多个语义不清晰,例如expr_context
有没有比ast
文档更多关于ast
模块的信息呢?
特别是,我想知道expr_context
(以及它所有可能的值)到底是什么意思。
还有,Assign
和AugAssign
有什么区别呢?
另外,在给一个局部变量赋值时,能不能直接引用一个真实的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
),或者在像 FunctionDef
或 Lambda
这样的参数列表中(Param
)。
AugAssign
就像是 a = a <op> b
,而 Assign
只是简单的 a = b
。
我还没有找到引用真实 Python 对象的方法,看起来是没有的。