2014-12-31 8 views
12

Betrachten Sie dieses Stück Code:Pylint: Vermeiden INSIDE Docstrings Überprüfung (globale Richtlinie/rcfile)

def test(): 
    """This line is longer than 80 chars, but, for me this is ok inside a DOCSTRING, 
    this one is shorter. 
    """ 

    if 'This is toooooooooooooooooooooooooooooooooooo longggggggggggggggggggggggg': 
     print 'True' 

pylint Ausgang:

C: 5, 0: Line too long (84/80) (line-too-long) 
C: 9, 0: Line too long (83/80) (line-too-long) 

Gibt es eine Richtlinie avaliable (rcfile) ausschließen NURDOCSTRINGS von pylint checker?

A mehrzeiligeregex für ignore-long-lines (Dank@fredtantini) scheint ignoriert zu werden.

Umgebung Docstrings mit # pylint: dis/enable=line-too-long (Dank@Evert) wird die gewünschte Wirkung hervorrufen, aber ich bin für eine globale Richtlinie suchen, um den Trick zu machen.

+1

Haben Sie, wenn 'ignorieren-long-lines' nimmt ein mehrzeiliges regexp prüft werden? – fredtantini

+1

Ich denke, Sie könnten Docstrings mit '# pylint: dis/enable = line-too-long'-Kommentar umgeben, aber das macht weder Spaß noch ist es schön. – Evert

+1

Möglicherweise gibt es keine weiteren Optionen, siehe 'def check_lines (self, lines, i):' source in 'format.py'. Es könnte möglich sein, ein Plugin zu schreiben, um das zu überschreiben. – simonzack

Antwort

4

Das Problem ist, dass das, was Sie Fragen über überhaupt nicht konfigurierbar ist. Darüber hinaus, gemäß der PEP8:

Begrenzen Sie alle Zeilen auf maximal 79 Zeichen.

Für fließende lange Textblöcke mit weniger strukturellen Einschränkungen (Docstrings oder Kommentare) sollte die Zeilenlänge auf 72 Zeichen begrenzt werden.

Das sagte, lassen Sie uns the source code analysieren und sehen, ob wir mit einer Lösung kommen können. Der Checker, der für die Überprüfung der Zeilenlänge zuständig ist, heißt FormatChecker - er prüft auch auf Einrückungen und nicht autorisierte Code-Konstruktionen.

Das sind zwei relevante Methoden, die wir interessiert sind:

Wie Sie die "zu lange Linie" sehen Fehlermeldung hinzugefügt werden hier:

if len(line) > max_chars and not ignore_long_line.search(line): 
    self.add_message('line-too-long', line=i, args=(len(line), max_chars)) 

ignore_long_line bezieht sich hier auf die Einstellung ignore-long-lines für reguläre Ausdrücke, die standardmäßig ^\s*(#)?<?https?://\S+>?$ entspricht. Dies würde helfen, falls HTTP-Links in der Zeichenfolge (doc) vorhanden sind - es würde kein Fehler ausgegeben.

Mit anderen Worten, es gibt nur die Einstellung ignore-long-lines, die verhindern kann, dass pylint die Prüfung "zu lange Zeile" anwendet.

beachten Sie auch die interessante Tatsache: die pylint Code-Qualitätsprüfung Dienstprogramm hat diese irreführende docstring:

def check_lines(self, lines, i): 
    """check lines have less than a maximum number of characters 
    """ 

während das Verfahren überprüft auch für missing-final-newline und trailing-whitespace. Das ist etwas, was Sie niemals statisch verstehen würden - menschliche Fehler, die nur von einem Menschen bemerkt und behoben werden können.


Ich mag den folgenden Vorschlag nicht, aber wir können Affe-Patch die FormatChecker on the fly.

Erstellen Sie ein Skript namens "checker.py" und legen Sie es auf PYTHONPATH. Hier definieren wir die new_line()-Methode neu und fügen eine "Token-Typ" -Kontrolle hinzu - lassen Sie den Prüfer die check_lines()-Methode nicht aufrufen, wenn dies ein Kommentar oder eine Zeichenfolge (Docstring) ist. Dann wird in der register() Funktion überschreiben wir die eingebaute in FormatChecker ‚s new_line() mit uns:

import tokenize 
from pylint.checkers.format import FormatChecker, _last_token_on_line_is, _JUNK_TOKENS 
import new 


class MyFormatChecker(object): 
    def new_line(self, tokens, line_end, line_start): 
     if _last_token_on_line_is(tokens, line_end, ';'): 
      self.add_message('unnecessary-semicolon', line=tokens.start_line(line_end)) 

     line_num = tokens.start_line(line_start) 
     line = tokens.line(line_start) 

     token_type = tokens.type(line_start) 
     if token_type not in _JUNK_TOKENS: 
      self._lines[line_num] = line.split('\n')[0] 

     if token_type not in (tokenize.COMMENT, tokenize.STRING): 
      self.check_lines(line, line_num) 


def register(linter): 
    format_checker = linter._checkers['format'][0] 
    format_checker.new_line = new.instancemethod(MyFormatChecker.new_line.im_func, format_checker, 
               FormatChecker.__class__) 

Run pylint mit --load-plugins Befehlszeilenargument:

$ pylint --load-plugins checker script.py 

Demo:

  • ohne das Plugin

    $ pylint script.py 
    C: 2, 0: Line too long (85/79) (line-too-long) 
    C: 6, 0: Line too long (83/79) (line-too-long) 
    C: 1, 0: Missing module docstring (missing-docstring) 
    
  • mit dem Plugin (keine Beschwerden über den docstring)

    $ pylint --load-plugins=checker script.py 
    C: 6, 0: Line too long (83/79) (line-too-long) 
    C: 1, 0: Missing module docstring (missing-docstring) 
    

wo script.py enthält:

def test(): 
    """This line is longer than 80 chars, but , for me this is ok inside a DOCSTRING, 
    this one is shorter. 
    """ 

    if 'This is toooooooooooooooooooooooooooooooooooo longggggggggggggggggggggggg': 
     print 'True' 

Es gibt nur wenige Hinweise, die zu erwähnen haben:

  • das ist zu kompliziert, zerbrechlich, instabil und magische jemals
  • sehen die erste Note