据我所知,如果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();
}
是一个陈述?
答案 0 :(得分:5)
因为将它作为语句允许将其编译为专用字节码,解释器循环使用该字节码来处理退出正常流并进入异常处理阶段,这涉及以与常规{{1}不同的方式退出函数堆栈}}
如果您将其作为一项功能,则无法执行此操作。该函数必须回调到解释器循环以改变状态。
此外,提升和处理异常是语言的核心,就像return
在函数中一样。您希望为其他工具提供检测此类使用的能力; return
是代码流中的一个重要事件,它对Python解释器来说并不重要。代码分析工具也应该能够检测它,而不必区分用作原始内置函数的raise
与所有其他可能的赋值,甚至是函数的重新绑定。