首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python 2.7中'raise a,b,c‘和'raise (a,b,c)’是一样的

在Python 2.7中'raise a,b,c‘和'raise (a,b,c)’是一样的
EN

Stack Overflow用户
提问于 2017-03-31 03:11:53
回答 2查看 134关注 0票数 0

有人能解释一下在Python2.7中'raise a,b,c‘和'raise (a,b,c)’是不是一样的原因?

我试图从herehere中找到关于如何处理元组的信息,但我不能确定是否可以使用上面的表达式来代替其他表达式。

下面是一些背景知识。我有一段Python 2代码,其中包含很多以下语句

代码语言:javascript
复制
raise e,v,t

Python 3在这个语法上给出了错误。将其转换为以下代码可以避免Python3编译器错误,但我想验证Python2和Python3中的意图是否相同。

代码语言:javascript
复制
raise (e,v,t)
EN

回答 2

Stack Overflow用户

发布于 2017-03-31 04:21:28

raise从未将元组作为参数。在Python2中,语法看起来像一个元组,这就是您的困惑所在。Python3的语法发生了重大变化,删除了冗余的异常类类型,并使用关键字from代替逗号。

在Python 2中:

代码语言:javascript
复制
raise a, b, c

在Python 3中变成:

代码语言:javascript
复制
raise b.with_traceback(c)
票数 1
EN

Stack Overflow用户

发布于 2017-03-31 04:41:15

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

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

代码语言:javascript
复制
raise ((Exception,), "other", "tuple", "items", "get", "ignored")

得到的对待就像

代码语言:javascript
复制
raise Exception

这是一个demo。Python3的行为是错误的( more sensibly ),因为元组也不例外。

在Python 3上引发异常的语法已更改。Python 2语句

代码语言:javascript
复制
raise ExceptionType, value, traceback

是现在

代码语言:javascript
复制
raise ExceptionType(value).with_traceback(traceback)

或者,如果valueExceptionType的一个实例,

代码语言:javascript
复制
raise value.with_traceback(traceback)

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

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

代码语言:javascript
复制
six.reraise(ExceptionType, value, traceback)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43126518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档