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
Haben Sie, wenn 'ignorieren-long-lines' nimmt ein mehrzeiliges regexp prüft werden? – fredtantini
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
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