理解 Python 的 ast 中的 ctx
Understanding ctx in Python's ast
Python AST 表示中的 ctx
参数是什么?例如:
>>> print(ast.dump(ast.parse('-a')))
Module(body=[Expr(value=UnaryOp(op=USub(), operand=Name(id='a', ctx=Load())))])
换句话说,ctx=Load()
是什么意思或作用?我能从文档中看到的唯一信息是 ctx 可能是以下之一:
expr_context = Load | Store | Del | AugLoad | AugStore | Param
https://docs.python.org/3.7/library/ast.html。有人可以解释各种 expr_context
以及它们的作用吗?我想 lhs 和 rhs 是 store/load:
>>> print(ast.dump(ast.parse('b=-a')))
Module(body=[Assign(targets=[Name(id='b', ctx=Store())], value=UnaryOp(op=USub(), operand=Name(id='a', ctx=Load())))])
但除此之外,还有哪些其他选择?
更新: 另外,是的,还有一个与此类似的问题,Python AST: several semantics unclear, e.g. expr_context,但接受的答案以 "After some more testing and guessing:..."
开头,而且很简单(至少可以说)细节。我希望真正了解 ast
模块的人可以提供更彻底的答案。
Load
上下文中的表达式正在计算其值。 Store
表示正在分配一个表达式(包括用作 with
或 for
目标的方式),而 Del
表示正在删除一个表达式(使用del
)。 Python 3.9 ast
docs 中对此进行了描述,比 3.7 文档要好得多。
Param
、AugLoad
和 AugStore
可以安全地忽略。从 Python 3.7 开始,它们从未出现在实际的 AST 中,而从 3.9 开始,它们完全消失了,即使在实现级别也是如此。在 3.7 中,AugLoad
和 AugStore
有时会出现在编译器内部创建的 temporary objects 中,但从未出现在实际的 AST 中。据我所知,自从函数注释的引入迫使 Python 3.0.
中函数参数的 AST 表示重新设计以来,Param
就再也没有被使用过
Python AST 表示中的 ctx
参数是什么?例如:
>>> print(ast.dump(ast.parse('-a')))
Module(body=[Expr(value=UnaryOp(op=USub(), operand=Name(id='a', ctx=Load())))])
换句话说,ctx=Load()
是什么意思或作用?我能从文档中看到的唯一信息是 ctx 可能是以下之一:
expr_context = Load | Store | Del | AugLoad | AugStore | Param
https://docs.python.org/3.7/library/ast.html。有人可以解释各种 expr_context
以及它们的作用吗?我想 lhs 和 rhs 是 store/load:
>>> print(ast.dump(ast.parse('b=-a')))
Module(body=[Assign(targets=[Name(id='b', ctx=Store())], value=UnaryOp(op=USub(), operand=Name(id='a', ctx=Load())))])
但除此之外,还有哪些其他选择?
更新: 另外,是的,还有一个与此类似的问题,Python AST: several semantics unclear, e.g. expr_context,但接受的答案以 "After some more testing and guessing:..."
开头,而且很简单(至少可以说)细节。我希望真正了解 ast
模块的人可以提供更彻底的答案。
Load
上下文中的表达式正在计算其值。 Store
表示正在分配一个表达式(包括用作 with
或 for
目标的方式),而 Del
表示正在删除一个表达式(使用del
)。 Python 3.9 ast
docs 中对此进行了描述,比 3.7 文档要好得多。
Param
、AugLoad
和 AugStore
可以安全地忽略。从 Python 3.7 开始,它们从未出现在实际的 AST 中,而从 3.9 开始,它们完全消失了,即使在实现级别也是如此。在 3.7 中,AugLoad
和 AugStore
有时会出现在编译器内部创建的 temporary objects 中,但从未出现在实际的 AST 中。据我所知,自从函数注释的引入迫使 Python 3.0.
Param
就再也没有被使用过