pylint的语法错误(提高三个参数/表达式)
问题描述:
我在看这个最小有效的程序(?):pylint的语法错误(提高三个参数/表达式)
import sys
def f():
try:
raise Exception()
except Exception:
raise Exception(), None, sys.exc_info()[2]
f()
该程序执行,并按照我们的期望,保留的堆栈跟踪内部例外,如help("raise")
所述。然而,当我在它上面运行pylint
,这是我所得到的:当我删除第二个和第三个表达式来raise
$ pylint program.py
************* Module tmp
E: 7, 0: invalid syntax (<string>, line 7) (syntax-error)
的语法错误消失。
这是pylint中的错误,还是我忽略了某些东西?
答
您的pylint二进制测试用于Python 3语法,您的代码仅适用于Python 2。 Pylint会根据您安装Python二进制文件的语法(它使用Python自己的解析器)来测试代码。
在Python 3,你会使用:
raise Exception().with_traceback(sys.exc_info()[2])
见raise
statement文档的Python 3
当你语法可以为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
我完全忘了我是如何用python3安装pylint的,谢谢! 关于使用'raise'错误,我的机器上的文档明确指出:'如果第一个对象是一个实例,则异常的类型是实例的类,实例本身就是值,第二个对象必须是“无” .'。这是否发生了跨版本变化? – goncalopp