理解 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 表示正在分配一个表达式(包括用作 withfor 目标的方式),而 Del 表示正在删除一个表达式(使用del)。 Python 3.9 ast docs 中对此进行了描述,比 3.7 文档要好得多。

ParamAugLoadAugStore 可以安全地忽略。从 Python 3.7 开始,它们从未出现在实际的 AST 中,而从 3.9 开始,它们完全消失了,即使在实现级别也是如此。在 3.7 中,AugLoadAugStore 有时会出现在编译器内部创建的 temporary objects 中,但从未出现在实际的 AST 中。据我所知,自从函数注释的引入迫使 Python 3.0.

中函数参数的 AST 表示重新设计以来,Param 就再也没有被使用过