有效程序上的pylint语法错误(使用三个参数/表达式引发)

时间:2017-09-25 08:37:07

标签: python exception pylint raise

我正在看这个最小的有效(?)程序:

import sys

def f():
    try:
        raise Exception()
    except Exception:
        raise Exception(), None, sys.exc_info()[2]

f()

该程序按预期执行和运行,保留内部异常的堆栈跟踪,如help("raise")所述。但是,当我在其上运行pylint时,这就是我得到的:

$ pylint program.py 
************* Module tmp
E:  7, 0: invalid syntax (<string>, line 7) (syntax-error)

当我将第二个和第三个表达式移到raise时,语法错误消失了。

这是pylint中的错误,还是我忽略了什么?

1 个答案:

答案 0 :(得分:1)

您的Python 3语法的pylint二进制测试,您的代码仅适用于Python 2。 Pylint按照您安装它的Python二进制文件的语法测试代码(它使用Python自己的解析器)。

在Python 3中,您将使用:

raise Exception().with_traceback(sys.exc_info()[2])

请参阅Python 3的raise statement文档。

虽然您的语法对于Python 2可能是正确的,但您在技术上使用raise错误。传入3个元素时,第一个元素必须是,而不是实例。第二个是该类的实例,第三个是追溯:

raise Exception, Exception(), sys.exc_info()[2]

或者您可以传入None以获取传递给第一个(类)的空参数列表来创建实例:

raise Exception, None, sys.exc_info()[2]

您的代码仍然可以工作,但仅仅是因为Python不是太严格,并且当第一个参数不是类时将其作为实例。

如果要使用pylint测试Python 2代码,请将副本安装到Python 2二进制文件中,然后运行该版本。见Specify which python version pylint should evaluate for