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

时间:2018-01-03 09:40:39

标签: python

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

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

另一个原因是,如果要将参数解释为代码,则不一定要对其进行求值。例如。如果myfunc()testbool,则True只会致电raise

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

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

与此同时,以raise作为陈述是以无法使用单词raise作为变量名称为代价的,这会看到很多用途,考虑到它一个相当普通的英语动词。 (我可以筹集一个平台,将数字提高1,......)

我还想象较少的语句会简化编译器。

那么为什么/** * Repository method for finding the newest inserted * entry inside the database. Will return the latest * entry when one is existent, otherwise will return * null. * * @return MyTable|null */ public function findLastInserted() { return $this ->createQueryBuilder("e") ->orderBy("id", "DESC") ->setMaxResults(1) ->getQuery() ->getOneOrNullResult(); } 是一个陈述?

1 个答案:

答案 0 :(得分:5)

因为将它作为语句允许将其编译为专用字节码,解释器循环使用该字节码来处理退出正常流并进入异常处理阶段,这涉及以与常规{{1}不同的方式退出函数堆栈}}

如果您将其作为一项功能,则无法执行此操作。该函数必须回调到解释器循环以改变状态。

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