是';提出a、b、c和#x27;和';提高(a、b、c)和#x27;在Python2.7中也是如此
有人能解释一下为什么或者为什么在Python2.7中“raisea,b,c”和“raise(a,b,c)”是相同的吗 我试图找到有关元组是如何从中处理的信息,但我无法确定是否可以使用上述表达式来代替其他表达式 以下是一些背景。 我有一个Python2代码,其中有很多下面的语句是';提出a、b、c和#x27;和';提高(a、b、c)和#x27;在Python2.7中也是如此,python,python-2.7,exception,Python,Python 2.7,Exception,有人能解释一下为什么或者为什么在Python2.7中“raisea,b,c”和“raise(a,b,c)”是相同的吗 我试图找到有关元组是如何从中处理的信息,但我无法确定是否可以使用上述表达式来代替其他表达式 以下是一些背景。 我有一个Python2代码,其中有很多下面的语句 raise e,v,t Python3给出了这个语法错误。 将其转换为以下内容可以避免Python3编译器错误,但我想验证Python2和Python3中的意图是否保持相同 raise (e,v,t) raise从未将
raise e,v,t
Python3给出了这个语法错误。
将其转换为以下内容可以避免Python3编译器错误,但我想验证Python2和Python3中的意图是否保持相同
raise (e,v,t)
raise
从未将元组作为参数。在Python2中,语法看起来像一个元组,这就是造成混淆的原因。Python3的语法发生了重大变化,删除了冗余的异常类类型,并使用关键字from
代替逗号
在Python 2中:
raise a, b, c
在Python 3中变成:
raise b.with_traceback(c)
raise
从未将元组作为参数。在Python2中,语法看起来像一个元组,这就是造成混淆的原因。Python3的语法发生了重大变化,删除了冗余的异常类类型,并使用关键字from
代替逗号
在Python 2中:
raise a, b, c
在Python 3中变成:
raise b.with_traceback(c)
切勿将元组传递给
raise
。它不会做你所期望的
在Python2和Python3上,raise
被记录为不接受元组。但是,Python2在raise
实现中有一个参数,如果raise
的第一个(或唯一的)参数是一个元组,它将被其第一个元素反复替换,直到Python达到非元组的值为止。我不知道为什么会这样,但它的意思是
raise ((Exception,), "other", "tuple", "items", "get", "ignored")
被当作
raise Exception
这是一个例子。Python3的行为会出错,因为元组不是例外
在Python3上引发异常的语法已更改。Python2语句
raise ExceptionType, value, traceback
现在是
raise ExceptionType(value).with_traceback(traceback)
或者,如果值
是例外类型
的实例
raise value.with_traceback(traceback)
不幸的是,这些语法是不兼容的,以至于您甚至不能根据您的Python版本编写这两个语法并选择运行哪一个。在代码运行之前,您将得到一个语法错误
解决此问题的最简单方法是使用兼容性库。例如,使用:
切勿将元组传递给
raise
。它不会做你所期望的
在Python2和Python3上,raise
被记录为不接受元组。但是,Python2在raise
实现中有一个参数,如果raise
的第一个(或唯一的)参数是一个元组,它将被其第一个元素反复替换,直到Python达到非元组的值为止。我不知道为什么会这样,但它的意思是
raise ((Exception,), "other", "tuple", "items", "get", "ignored")
被当作
raise Exception
这是一个例子。Python3的行为会出错,因为元组不是例外
在Python3上引发异常的语法已更改。Python2语句
raise ExceptionType, value, traceback
现在是
raise ExceptionType(value).with_traceback(traceback)
或者,如果值
是例外类型
的实例
raise value.with_traceback(traceback)
不幸的是,这些语法是不兼容的,以至于您甚至不能根据您的Python版本编写这两个语法并选择运行哪一个。在代码运行之前,您将得到一个语法错误
解决此问题的最简单方法是使用兼容性库。例如,使用:
你试过了吗?你得到同样的结果了吗?你试过检查Python3吗?@AChampion:我在python解释器中尝试了
x=1,2,3
和x=(1,2,3)
,得到了相同的“type(x)”,这就是为什么我不知道这是否是一个安全的更改。换句话说,不,这是不一样的。事实上,在Python3中,如果您执行该行,您将得到一个错误,因为它将尝试调用该实例(这是一个元组),并且您只能引发派生自BaseException
的对象。您是否尝试过它们?你得到同样的结果了吗?你试过检查Python3吗?@AChampion:我在python解释器中尝试了x=1,2,3
和x=(1,2,3)
,得到了相同的“type(x)”,这就是为什么我不知道这是否是一个安全的更改。换句话说,不,这是不一样的。事实上,在Python3中,如果您执行该行,您将得到一个错误,因为它将尝试调用该实例(这是一个元组),并且您只能引发派生自BaseException
的对象,因为您将异常链接语法与备用回溯的语法混合在一起。选择不同回溯的方法是方法,因此它是raisea(b)。使用traceback(c)
,或者raiseb。如果b
已经是a
的一个实例(或者其他一些变体之一,因为Python 2有很多方法来解释第二个raise
参数),则使用@用户2357112谢谢,我误读了文档。实际上,除了一个简单的异常
类之外,我从来没有尝试过提出任何东西。您已经将异常链接语法与备用回溯的语法混淆了。选择不同回溯的方法是方法,因此它是raisea(b)。使用traceback(c)
,或者raiseb。如果b
已经是a
的一个实例(或者其他一些变体之一,因为Python 2有很多方法来解释第二个raise
参数),则使用@用户2357112谢谢,我误读了文档。实际上,除了一个简单的异常
类之外,我从未尝试过提出任何东西。