从 Python 2 到 Python 3 的基本变化之一是使 print
成为一个函数——对我来说,考虑到它的结构,这是非常有意义的。为什么 raise
和 del
语句也不起作用?特别是在 raise
的情况下,它似乎正在接受一个参数并用它做一些事情,就像一个函数一样。
最佳答案
raise
和 del
绝对不同于函数,每个都有不同的原因:
raise
退出当前执行流程;字节码解释的正常流程被中断,堆栈被展开,直到找到下一个异常处理程序。函数不能这样做,而是创建一个新的堆栈帧。 del
不能是函数,因为你必须指定一个具体的目标;您不能只使用任何表达式,删除的内容取决于给定的语法;如果您使用订阅,则会对容器中的给定元素进行删除,或者从当前命名空间中删除名称。要删除的正确命名空间也取决于删除的名称的范围。查看 del
statement grammar definition :函数不能从父命名空间中删除项,也不能区分订阅表达式的结果或直接引用。您将对象传递给函数,但向
del
语句传递名称和上下文(可能由解释器在删除本地或全局名称时传递)。 另一方面,
print
不需要与当前命名空间或堆栈框架的特殊关系,也不需要特殊的语法约束来完成它的工作。它纯粹是应用程序级别的功能。函数和解释器都可以访问全局 sys.stdout
引用。因此,它不需要是一个语句,通过将它移动到一个函数,可以获得额外的好处,例如能够覆盖它的行为并在 Python 版本中更快地对其进行创新。请注意,
raise
语句的 部分 已移至应用程序级代码;在 Python 2 中,您可以通过以下方式将回溯附加到引发的异常:raise ExceptionClass, exception_value, traceback_object
在 Python 3 中,将回溯附加到异常已移至异常本身:
raise Exception("foo occurred").with_traceback(tracebackobj)
关于python - 为什么 Python 中没有 "raise"和 "del"函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37910465/