有人可以解释为什么或为什么不提出a,b,c,'并且“提升(a,b,c)'在Python 2.7中是相同的。
我试图找到有关如何处理here和here元组的信息,但我无法确定是否可以使用上述表达式代替彼此。
这是一些背景知识。 我有一个Python 2代码,它有很多以下语句
raise e,v,t
Python 3在此语法上给出错误。 将它转换为以下内容会导致Python 3编译器错误,但我想验证Python 2和Python 3中的intent是否保持相同。
raise (e,v,t)
答案 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)
或,如果value
是ExceptionType
的实例,
raise value.with_traceback(traceback)
不幸的是,这些语法与您甚至无法同时编写这两种语法并根据您的Python版本选择运行哪种语法是不兼容的。在代码运行之前,您将收到语法错误。
解决此问题的最简单方法是使用兼容性库。例如,使用six.reraise
:
six.reraise(ExceptionType, value, traceback)