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

+0

我完全忘了我是如何用python3安装pylint的,谢谢! 关于使用'raise'错误,我的机器上的文档明确指出:'如果第一个对象是一个实例,则异常的类型是实例的类,实例本身就是值,第二个对象必须是“无” .'。这是否发生了跨版本变化? – goncalopp