理解Python的ast中的ctx

sam*_*249 9 python abstract-syntax-tree python-3.x python-internals

ctxPython AST 表示中的参数是什么?例如:

>>> print(ast.dump(ast.parse('-a')))
Module(body=[Expr(value=UnaryOp(op=USub(), operand=Name(id='a', ctx=Load())))])
Run Code Online (Sandbox Code Playgroud)

换句话说,这ctx=Load()意味着什么或做什么?我从文档中看到的唯一信息是 ctx 可能是以下之一:

expr_context = Load | Store | Del | AugLoad | AugStore | Param
Run Code Online (Sandbox Code Playgroud)

https://docs.python.org/3.7/library/ast.html。有人可以解释一下各种情况expr_context以及它们的作用吗?我想 lhs 和 rhs 是存储/加载:

>>> 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())))])
Run Code Online (Sandbox Code Playgroud)

但除此之外,还有哪些其他选择?


更新:另外,是的,还有另一个与此类似的问题,Python AST:几个语义不清楚,例如 expr_context,但接受的答案以 开头,"After some more testing and guessing:..."并且它在细节上相当简单(至少可以说)。我希望真正了解该ast模块的人可以提供更全面的答案。

use*_*ica 7

上下文中的表达式Load正在计算其值。Store表示正在将表达式分配给(包括以诸如用作withfor目标的方式),并Del表示正在删除表达式(使用del)。Python 3.9ast文档对此进行了描述,比 3.7 文档好得多。

ParamAugLoad、 和AugStore可以安全地忽略。从 Python 3.7 开始,它们从未出现在实际的 AST 中,从 3.9 开始,它们完全消失了,即使在实现层面也是如此。在 3.7 中,AugLoad有时AugStore出现在编译器内部创建的临时对象中,但从未出现在实际的 AST 中。据我所知,自从ParamPython 3.0 中函数注释的引入迫使重新设计函数参数的 AST 表示以来,它就没有被使用过。