是否会提升a,b,c,'并且“提升(a,b,c)'同样在Python 2.7中

时间:2017-03-30 19:11:53

标签: python exception

有人可以解释为什么或为什么不提出a,b,c,'并且“提升(a,b,c)'在Python 2.7中是相同的。

我试图找到有关如何处理herehere元组的信息,但我无法确定是否可以使用上述表达式代替彼此。

这是一些背景知识。 我有一个Python 2代码,它有很多以下语句

raise e,v,t

Python 3在此语法上给出错误。 将它转换为以下内容会导致Python 3编译器错误,但我想验证Python 2和Python 3中的intent是否保持相同。

raise (e,v,t)

2 个答案:

答案 0 :(得分:1)

raise 从未将元组作为参数。在Python 2中,语法是看起来就像一个元组,这是你的混乱来源。 Python 3有一个剧烈的语法更改,其中删除了冗余异常类类型,并使用关键字from代替逗号。

在Python 2中:

raise a, b, c

成为Python 3:

raise b.with_traceback(c)

答案 1 :(得分:1)

永远不要将元组传递给raise。它不会做你期望的。

在Python 2和Python 3上,raise都被记录为不接受元组。但是,Python 2在raise实现中有一个weird code path,如果raise的第一个(或唯一的)参数是一个元组,它将被第一个元素重复替换,直到Python到达一些不是元组的东西。我不知道为什么这是一个东西,但它意味着类似

raise ((Exception,), "other", "tuple", "items", "get", "ignored")

被视为

raise Exception

这里是demo。 Python 3表现为more sensibly,错误,因为元组不是异常。

在Python 3上改进了引发异常的语法.Python 2语句

raise ExceptionType, value, traceback

现在是

raise ExceptionType(value).with_traceback(traceback)

或,如果valueExceptionType的实例,

raise value.with_traceback(traceback)

不幸的是,这些语法与您甚至无法同时编写这两种语法并根据您的Python版本选择运行哪种语法是不兼容的。在代码运行之前,您将收到语法错误。

解决此问题的最简单方法是使用兼容性库。例如,使用six.reraise

six.reraise(ExceptionType, value, traceback)