Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解Python中的ctx';阿斯特_Python_Python 3.x_Abstract Syntax Tree_Python Internals - Fatal编程技术网

理解Python中的ctx';阿斯特

理解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

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
。有人能解释一下各种
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
表示表达式正在被删除(with
Del
)。这在中进行了描述,它比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: