在Python2.7中,“raise a,b,c”和“raise(a,b,c)”是否相同

2024-05-14 22:24:02 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能解释一下为什么在python2.7中“raisea,b,c”和“raise(a,b,c)”是相同的吗。你知道吗

我试图找到有关如何从herehere处理元组的信息,但我无法确定是否可以使用上述表达式来代替其他表达式。你知道吗

以下是一些背景。 我有一个Python2代码,它有很多下面的语句

raise e,v,t

python3给出了这个语法错误。 将其转换为以下内容可以避免python3编译器错误,但我想验证python2和python3中的意图是否保持相同。你知道吗

raise (e,v,t)

Tags: 代码信息here编译器表达式错误语句python3
2条回答

raise从未将元组作为参数。在python2中,语法是这样的:它看起来像一个元组,这就是你的困惑所在。python3的语法发生了巨大的变化,删除了冗余的异常类类型,并用关键字from代替逗号。你知道吗

在Python 2中:

raise a, b, c

在Python 3中变为:

raise b.with_traceback(c)

永远不要将元组传递给raise。它做不到你所期望的。你知道吗

在python2和python3上,raise被记录为不接受元组。但是,python2在raise实现中有一个weird code path,如果raise的第一个(或唯一的)参数是一个元组,它将被它的第一个元素反复替换,直到Python到达一个不是元组的元素。我不知道这是为什么,但它的意思是

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

被当作

raise Exception

这是一个demo。python3的行为是more sensibly,出错是因为元组不是例外。你知道吗


在python3上引发异常的语法发生了变化。python2语句

raise ExceptionType, value, traceback

是现在

raise ExceptionType(value).with_traceback(traceback)

或者,如果valueExceptionType的实例

raise value.with_traceback(traceback)

不幸的是,这些语法是不兼容的,以至于您甚至不能同时编写这两个语法并根据Python版本选择运行哪一个。在你的代码运行之前,你会得到一个语法错误。你知道吗


解决这个问题的最简单方法是使用兼容性库。例如,使用^{}

six.reraise(ExceptionType, value, traceback)

相关问题 更多 >

    热门问题