理解Python中的ctx';阿斯特
Python AST表示中的理解Python中的ctx';阿斯特,python,python-3.x,abstract-syntax-tree,python-internals,Python,Python 3.x,Abstract Syntax Tree,Python Internals,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 | AugSto
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
。有人能解释一下各种expr\u上下文以及它们的作用吗?我认为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())))])
但除此之外,还有什么其他选择
更新:另外,是的,还有一个类似的问题,但公认的答案以“经过更多的测试和猜测:…”
开头,并且(至少可以说)在细节上非常简单。我希望对ast模块有更多了解的人能够提供更全面的答案。加载上下文中的表达式正在计算其值Store
表示表达式正在被分配(包括用作with
或for
目标的),而Del
表示表达式正在被删除(withDel
)。这在中进行了描述,它比3.7文档要好得多
可以安全地忽略Param
、AugLoad
和AugStore
。从Python3.7开始,它们从未出现在实际的AST中,而从3.9开始,它们就完全消失了,甚至在实现级别也是如此。在3.7中,AugLoad
和AugStore
有时出现在编译器内部创建的中,但从未出现在实际的AST中。据我所知,Param
自从函数注释的引入迫使Python 3.0重新设计了函数参数的AST表示形式后,就再也没有被使用过。@MikeScotty这很简单——即使回答者也说他知道的不多,这需要很多猜测和检查。希望我们能找到对其他人更有用的东西?您是否阅读了接受的答案?请注意,不同Python版本上的上下文是不同的。Python 3.9文档只列出加载、存储和删除。@user2357112supportsMonica噢,哇,仅使用这三个文档就更直观、更容易理解了。@user2357112supportsMonica感谢!3.9也有很棒的文档,在那之前它是相当糟糕的。Param曾经在python2.x中使用:$astpretty/dev/stdin@AnthonySottile:看起来区别在于函数注释迫使在3.0中更改函数参数的AST表示。我对答案进行了一点扩展。@user2357112supportsMonica问题:当你说…有时出现在编译器内部创建的临时对象中时--“编译器”是什么?你是说AST和相关文件吗?@samuelbrody1249:我说的是字节码编译器,负责将AST转换为Python字节码。@samuelbrody1249: