有效程序上的 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
我正在查看这个最小的有效(?)程序:
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