2017-09-25 2 views
0

Ich bin an diesem minimal gültig suche Programm (?):Pylint Syntaxfehler auf gültiges Programm (raise mit drei Argumenten/Ausdrücke)

import sys 

def f(): 
    try: 
     raise Exception() 
    except Exception: 
     raise Exception(), None, sys.exc_info()[2] 

f() 

Dieses Programm führt und wie erwartet verhalten, die Erhaltung den Stack-Trace die innere Ausnahme, wie durch help("raise") dokumentiert. Allerdings, wenn ich pylint darauf laufen, das ist, was ich bekommen:

$ pylint program.py 
************* Module tmp 
E: 7, 0: invalid syntax (<string>, line 7) (syntax-error) 

Die Syntax-Fehler verschwindet, wenn ich den zweiten und dritten Ausdrücke raise entfernen.

Ist das ein Fehler in pylint, oder übersehe ich etwas?

Antwort

1

Ihr Pylint-Binär-Test für Python 3-Syntax, Ihr Code ist nur für Python 2 gültig. Pylint testet den Code nach der Syntax der Python-Binärdatei, mit der Sie ihn installiert haben (er verwendet Pythons eigenen Parser).

In Python 3, dann würden Sie verwenden:

raise Exception().with_traceback(sys.exc_info()[2]) 

Siehe raise statement Dokumentation für Python 3.

Während Ihre Syntax Python für richtig sein kann 2, Sie sind technisch falsch mit raise . Bei der Übergabe von 3 Elementen muss der erste eine Klasse sein, keine Instanz. Die zweite ist eine Instanz der Klasse, die dritte die Zurückverfolgungs:

raise Exception, Exception(), sys.exc_info()[2] 

oder Sie in None für eine leere Argumentliste übergeben an die erste (die Klasse) passieren kann, eine Instanz zu erstellen:

raise Exception, None, sys.exc_info()[2] 

Ihr Code funktioniert immer noch, aber nur, weil Python nicht zu streng ist und das erste Argument als die Instanz nimmt, wenn es keine Klasse ist.

Wenn Sie Python 2-Code mit pylint testen möchten, installieren Sie eine Kopie in Ihre Python 2-Binärdatei, und führen Sie diese Version aus. Siehe Specify which python version pylint should evaluate for

+0

Ich habe komplett vergessen, wie ich pylint mit python3 installiert hatte, danke! In Bezug auf die Verwendung von 'raise' falsch, die Dokumentation auf meiner Maschine explizit besagt, 'Wenn das erste Objekt eine Instanz ist, ist der Typ der Ausnahme die Klasse der Instanz, die Instanz selbst ist der Wert, und das zweite Objekt muss sein "Keine". Hat sich das zwischen den Versionen geändert? – goncalopp