2017-09-25 50 views
0

我在看這個最小有效的程序(?):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中的錯誤,還是我忽略了某些東西?

回答

1

您的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

相關問題