Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python AST:一些语义不清楚,例如expr\u上下文_Python_Abstract Syntax Tree - Fatal编程技术网

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中全部都没有了;现在只是加载、存储和删除。