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

pylint syntax error on valid program (raise with three arguments / expressions)

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

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中的错误,还是我忽略了什么?

您的 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 个元素时,第一个必须是 class,而不是实例。第二个是 class 的实例,第三个是回溯:

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

或者您可以传入 None 用于传递给第一个(class)的空参数列表以创建实例:

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

您的代码仍然可以正常工作,但这只是因为 Python 不是太严格,并且在第一个参数不是 class 时将其作为实例。

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