Python AST:一些语义不清楚,例如expr\u上下文
关于Python AST:一些语义不清楚,例如expr\u上下文,python,abstract-syntax-tree,Python,Abstract Syntax Tree,关于ast模块,是否有更多信息 特别是,我想知道expr\u context(及其所有可能的值)到底意味着什么 另外,Assign和augsign之间有什么区别 此外,在对局部变量赋值时,是否可以引用真实的Python对象而不是其名称?我自己正在构建一个AST,我有一些Python对象,我想在AST中访问它们。另一种方法是为它们引入一些伪临时变量名,并将该伪变量名添加到以后编译的函数的globals()作用域中,但这对我来说似乎有点糟糕(缓慢且有黑客味)。我将尝试自己回答 经过更多的测试和猜测:
ast
模块,是否有更多信息
特别是,我想知道expr\u context
(及其所有可能的值)到底意味着什么
另外,Assign
和augsign
之间有什么区别
此外,在对局部变量赋值时,是否可以引用真实的Python对象而不是其名称?我自己正在构建一个AST,我有一些Python对象,我想在AST中访问它们。另一种方法是为它们引入一些伪临时变量名,并将该伪变量名添加到以后编译的函数的
globals()
作用域中,但这对我来说似乎有点糟糕(缓慢且有黑客味)。我将尝试自己回答
经过更多的测试和猜测:
expr\u context
是定义名称的地方,例如,如果它位于赋值的左侧(Store
,AugStore
),右侧(Load
,AugLoad
),在del
(del
)或参数列表中,如FunctionDef
或Lambda
(Param
)
Assign
就像a=ab
Assign
只是一个简单的a=b
我还没有找到一种方法来引用一个真正的Python对象,但似乎没有。您可以使用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"
导入ast
数据=“”
x='1234'
x()
'''
def testfunc():
打印“内部测试功能”
tree=compile(数据,,'exec',ast.PyCF_ONLY_ast)
类ModVisitor(ast.NodeVisitor):
def访问(自我,节点):
如果isinstance(节点,ast.Str):
node.s=testfunc
self.generic_访问(节点)
ModVisitor().visit(树)
代码=编译(树“,”执行“)
exec代码#打印“内部测试功能”
注意:我在Python2.7中检查了这一点。我不确定是否可以保证这一点适用于早期或更高版本。AugLoad
和AugStore
在ASTs中没有实际使用,并且Param
从3.0开始就没有使用过。3.9中全部都没有了;现在只是加载、存储和删除。