在Python的ast中理解ctx

2024-10-03 06:25:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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。有人能解释一下各种{}以及它们的作用吗?我认为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())))])

但除此之外,还有什么其他选择


更新:另外,是的,还有一个类似的问题,Python AST: several semantics unclear, e.g. expr_context,但公认的答案是以"After some more testing and guessing:..."开始的,并且(至少可以说)在细节上非常简单。我希望真正理解ast模块多一点的人能够提供一个更全面的答案


Tags: nameidparsevalueloadbodyastdump
1条回答
网友
1楼 · 发布于 2024-10-03 06:25:40

Load上下文中的表达式正在计算其值Store表示正在将表达式分配给(包括用作withfor目标的方式),而Del表示正在删除表达式(使用del)。这在Python 3.9 ^{} docs中进行了描述,它比3.7文档要好得多

ParamAugLoadAugStore可以安全地忽略。从Python3.7开始,它们从未出现在实际的AST中,而从3.9开始,它们就完全消失了,甚至在实现级别也是如此。在3.7中,AugLoadAugStore有时出现在编译器内部创建的temporary objects中,但从未出现在实际的AST中。据我所知,Param自从函数注释的引入迫使Python 3.0重新设计函数参数的AST表示以来,就没有被使用过

相关问题 更多 >