Dil*_*rix 3 python structure function python-3.x
从Python 2到Python 3的一个基本变化就是创建print一个函数 - 对我而言,它的结构非常合理.为什么raise和del语句也不起作用?特别是在raise它似乎正在采取争论并用它做某事的情况下,就像一个函数一样.
raise并且del绝对不同于功能,每个功能有不同的原因:
raise退出当前的执行流程; 正常的字节码解释流程被中断,堆栈被解开,直到找到下一个异常处理程序.函数不能这样做,而是创建一个新的堆栈框架.
del不能是一个函数,因为你必须指定一个特定的目标 ; 你不能只使用任何表达式,删除的内容取决于给定的语法; 如果您使用订阅,则会对容器中的给定元素进行删除,或者从当前命名空间中删除名称.要删除的正确命名空间还取决于已删除名称的范围.请参阅del语句语法定义:
Run Code Online (Sandbox Code Playgroud)del_stmt ::= "del" target_list
函数不能从父命名空间中删除项,也不能区分订阅表达式的结果或直接引用.您将对象传递给函数,但是del传递给名称和上下文的语句(可能在删除本地或全局名称时由解释器传递).
print另一方面,它不需要与当前命名空间或堆栈帧有特殊关系,并且不需要特殊的语法约束来完成它的工作.它纯粹是应用程序级别的功能.sys.stdout函数可以访问全局引用,就像解释器一样.因此,它不需要是一个声明,并且通过将其移动到一个函数,可以获得额外的好处,例如能够覆盖它的行为并在Python版本中更快地进行创新.
做注意到,部分的的raise声明被转移到应用级代码来代替; 在Python 2中,您可以使用以下命令将回溯附加到引发的异常:
raise ExceptionClass, exception_value, traceback_object
Run Code Online (Sandbox Code Playgroud)
在Python 3中,将回溯附加到异常已移至异常本身:
raise Exception("foo occurred").with_traceback(tracebackobj)
Run Code Online (Sandbox Code Playgroud)