【问题标题】:Understanding ctx in Python's ast在 Python 的 ast 中理解 ctx
【发布时间】:2021-01-14 23:22:48
【问题描述】:

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 是存储/加载:

>>> 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 模块的人可以提供更全面的答案。

【问题讨论】:

  • @MikeScotty 这很简单——即使是回答者也说他知道的不多,而且需要大量的猜测和检查。希望我们能找到对其他人更有用的东西?您是否阅读了接受的答案?
  • 请注意,不同 Python 版本的上下文不同。 Python 3.9 文档仅列出 Load、Store 和 Del。
  • @user2357112supportsMonica 哇哦,这三个更直观,更容易理解......
  • 3.9 文档也有 actual documentation 用于加载、存储和删除。
  • @user2357112supportsMonica 谢谢! 3.9 也有很棒的文档,在那之前它很糟糕。

标签: python python-3.x abstract-syntax-tree python-internals


【解决方案1】:

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 就没有被使用过。

【讨论】:

  • python2.x中使用的参数:$ astpretty /dev/stdin <<< 'def f(x): pass' | grep Name args=[Name(lineno=1, col_offset=6, id='x', ctx=Param())],
  • @AnthonySottile:看起来不同之处在于函数注释强制在 3.0 中更改函数参数的 AST 表示。我已经扩展了答案。
  • @user2357112supportsMonica 问题:当您说...sometimes appeared in temporary objects created internally by the compiler 时——在这种情况下,“编译器”是什么?您是指github.com/python/cpython/blob/… 和相关文件吗?
  • @samuelbrody1249:我说的是字节码编译器,负责将 AST 转换为 Python 字节码。
  • @samuelbrody1249: The one I linked.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多