我正在看这个最小的有效(?)程序:
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中的错误,还是我忽略了什么?
答案 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