为什么不提高"和" del" Python中的函数?

时间:2016-06-19 18:27:28

标签: python function python-3.x structure

从Python 2到Python 3的一个基本变化是使print成为一个函数 - 对我来说,鉴于它的结构,它是完全合理的。为什么raisedel语句也不起作用?特别是在raise的情况下,似乎它正在采取一个参数并用它做一些事情,就像函数一样。

2 个答案:

答案 0 :(得分:5)

raisedel明确区别于功能,每种功能各有不同:

  • raise退出当前的执行流程;正常的字节码解释流程被中断,堆栈被解开,直到找到下一个异常处理程序。函数不能这样做,而是创建一个新的堆栈帧。

  • del无法成为一项功能,因为您必须指定特定的目标;你不能只使用任何表达式,删除的内容取决于给定的语法;如果您使用订阅,则会对容器中的给定元素进行删除,或者从当前命名空间中删除名称。要删除的正确命名空间还取决于已删除名称的范围。请参阅del statement grammar definition

    del_stmt ::=  "del" target_list
    

    函数不能从父命名空间中删除项目,也不能区分订阅表达式的结果或直接引用。您将对象传递给函数,但是传递给del语句传递名称和上下文(可能在删除本地或全局名称时由解释器传递)。

另一方面,

print不需要与当前命名空间或堆栈帧有特殊关系,并且不需要特殊的语法约束来完成它的工作。它纯粹是应用程序级别的功能。函数可以访问全局sys.stdout引用,就像解释器一样。因此,它不需要成为一个声明,并且通过将其移动到一个函数中,可以获得额外的好处,例如能够覆盖它的行为并在Python版本中更快地进行创新。

请注意,raise语句的部分已移至应用程序级代码;在Python 2中,您可以使用以下命令将追溯附加到引发的异常:

raise ExceptionClass, exception_value, traceback_object

在Python 3中,将回溯附加到异常已移至异常本身:

raise Exception("foo occurred").with_traceback(tracebackobj)

答案 1 :(得分:2)

https://www.python.org/dev/peps/pep-3105/列出了print成为函数的理由。在五个原因中,(IMO)最相关的原因是:

  

print是唯一具有专用语句的应用程序级功能。

Alex Martelli在此https://stackoverflow.com/a/1054062解释:

  

Python语句是Python编译器必须特别注意的事项 - 它们可能会改变名称的绑定,可能会改变控制流,和/或可能需要在某些条件下从生成的字节码中完全删除(后者适用)断言)。 print是Python 2中这个断言的唯一例外;通过从语句列表中删除它,Python 3删除了一个异常,使一般断言“只是保持”,因此是一种更常规的语言。

delraise显然会改变名称的绑定/改变控制流程,因此它们都可以。