为什么"提出"一个陈述而不是一个功能呢?

acd*_*cdr -3 python

据我所知,raise如果它是一个函数,而不是一个语句,它也会起作用.

在我看来,陈述的一个显着特征是他们的论点不被解释为"代码".例如import math,不要求你定义math,类似的函数需要一个字符串参数:import("math").

另一个是,如果一个参数被解释为代码,它不一定被评估.例如,assert testbool, myfunc()将只调用myfunc()如果testboolTrue.

最后,我想使用语句而不是函数可以避免由于调用函数而产生的一些开销.

这些优点都不适用于raise:它的参数总是必须被定义,并且没有raise执行语句的情况,但是它的参数没有被计算.最后,我想象一下,与提出异常所涉及的所有其他簿记相比,调用函数的开销是微不足道的.

与此同时,raise作为一个声明的代价是不能使用该词raise作为变量的名称,这将看到很多用途,因为它是一个相当普遍的英语动词.(我可以筹集一个平台,将数字提高1,......)

我还想象有更少的语句会简化编译器.

那么为什么要raise发表声明呢?

Mar*_*ers 5

因为使它成为一个语句允许它被编译为专用字节码,解释器循环使用它来处理退出正常流并进入异常处理阶段,这涉及以与常规方式不同的方式退出函数堆栈return.

如果你把它变成了一个功能,你就无法做到这一点.该函数必须回调到解释器循环以改变状态.

此外,提升和处理异常是语言的核心,就像return在函数中一样.您希望为其他工具提供检测此类使用的能力; raise是代码流中的一个重要事件,它对Python解释器来说并不重要.代码分析工具也应该能够检测它,而不必区分raise用作原始内置函数与所有其他可能的赋值,甚至是函数的重新绑定.

  • @acdr:我只能链接到`RAISE_VARARGS`操作码的当前实现,它使用`goto fast_block_end`跳转到异常流.您必须设想解释器循环必须在每个循环开始时检查此条件,而不是在函数设置标志以触发状态之后. (2认同)