gpt4 book ai didi

python - 为什么 "raise"和 "del"不是 Python 中的函数?

转载 作者:太空宇宙 更新时间:2023-11-03 13:13:14 24 4
gpt4 key购买 nike

从 Python 2 到 Python 3 的一个基本变化是使 print 成为一个函数——对我来说,考虑到它的结构,这非常有意义。为什么 raisedel 语句也不起作用?特别是在 raise 的情况下,它似乎正在接受一个参数并用它做一些事情,就像一个函数一样。

最佳答案

raisedel 与函数完全不同,原因各不相同:

  • raise 退出当前执行流程;字节码解释的正常流程被中断,堆栈被展开,直到找到下一个异常处理程序。函数无法做到这一点,它们会创建一个新的堆栈框架。

  • del 不能是一个函数,因为你必须指定一个特定的目标;您不能只使用任何表达式,删除的内容取决于给定的语法;如果您使用订阅,则会对容器中的给定元素进行删除,或者从当前 namespace 中删除名称。要删除到的正确命名空间还取决于删除名称的范围。查看del statement grammar definition :

    del_stmt ::=  "del" target_list

    函数不能从父命名空间中删除项目,也不能区分订阅表达式的结果或直接引用的结果。您将 objects 传递给函数,但对于 del 语句,您传递一个名称和一个上下文(可能在删除本地或全局名称时由解释器传递)。

另一方面,

print 不需要与当前命名空间或栈帧有特殊关系,也不需要特殊语法约束来完成它的工作。它是应用程序级别 的纯粹功能。全局 sys.stdout 引用可以像解释器一样被函数访问。因此,它不需要是一个语句,通过将它移动到一个函数,可以获得额外的好处,例如能够覆盖它的行为并在 Python 版本中更快地对其进行创新。

请注意,raise 语句的部分 已移至应用程序级代码;在 Python 2 中,您可以使用以下方法将追溯附加到引发的异常:

raise ExceptionClass, exception_value, traceback_object

在 Python 3 中,将追溯附加到异常已移至异常本身:

raise Exception("foo occurred").with_traceback(tracebackobj)

关于python - 为什么 "raise"和 "del"不是 Python 中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37910465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com