为何Python中的raise是语句而非函数?
为什么Python里的
raise是语句而不是函数? 我也仔细琢磨过这个问题——如果把raise设计成函数而非语句,它的核心功能其实完全不受影响。要搞懂这点,得先聊聊语句和函数的核心差异:
- 语句的一大特征是:它的参数不会被当作“代码”来解析。比如
import math里的math不需要预先定义,但如果是函数形式就得写成import("math"),得传入字符串参数; - 另一个特征是:如果语句的参数需要被解析为代码,也不一定会被求值。比如
assert testbool, myfunc(),只有当testbool为False时,才会调用myfunc()生成错误提示; - 此外,用语句而非函数,能避免函数调用带来的那一点点性能开销。
但这些优势,raise一个都沾不上:
raise的参数必须预先定义好——你总得先有个异常类或者异常实例才能抛出吧;- 只要执行
raise语句,它的参数一定会被求值,根本不存在“条件跳过求值”的情况; - 比起抛出异常时要做的那些簿记操作(比如生成栈追踪信息、处理异常上下文),函数调用的那点开销完全可以忽略不计。
反过来,把raise设为语句还得付出代价:
- 你没法把
raise用作变量名了。这可是个常用的英语动词,本来可以用来表示“搭建平台”“数值加1”这类场景,现在只能避着用; - 从编译器实现的角度看,减少特殊语句的数量,其实能简化语法分析和编译流程。
既然这么看下来,raise作为语句没什么明显优势,反而有不少小缺点,那它为啥偏偏是个语句呢?
内容的提问来源于stack exchange,提问作者acdr
相关产品推荐
相关产品推荐

