Il problema è che la cosa che stai chiedendo è non configurabile a tutti. Inoltre, secondo lo PEP8
:
Limita tutte le righe a un massimo di 79 caratteri.
Per scorre lunghi blocchi di testo con meno restrizioni strutturali (docstrings o commenti), la lunghezza della linea non deve superare i 72 caratteri .
Detto questo, analizziamo the source code e vediamo se riusciamo a trovare una soluzione. Il controllore che è responsabile del controllo della lunghezza della linea è chiamato FormatChecker
- controlla anche i rientri e le costruzioni di codice non autorizzate.
L'sono due metodi importanti che ci interessa:
Come si può vedere la "Linea troppo lungo" messaggio di errore è aggiunto qui:
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
qui si riferisce all'impostazione di espressione regolare ignore-long-lines
, che, per impostazione predefinita, è uguale a ^\s*(#)?<?https?://\S+>?$
, il che può essere d'aiuto nel caso in cui vi siano collegamenti http all'interno della stringa (doc): non verrà generato alcun errore.
In altre parole, c'è solo l'impostazione ignore-long-lines
che può impedire a Pylint di applicare il controllo "Troppo lungo".
Da notare anche il fatto interessante: l'utilità di controllo pylint
codice di qualità ha questo docstring fuorviante:
def check_lines(self, lines, i):
"""check lines have less than a maximum number of characters
"""
mentre il metodo controlla anche per missing-final-newline
e trailing-whitespace
. Questo è qualcosa che non prenderesti mai in modo statico: errore umano che può essere notato e risolto da un essere umano.
non mi piace la seguente proposta, ma possiamo scimmia-patchare il FormatChecker
al volo.
Creare uno script denominato "checker.py" e inserirlo su PYTHONPATH
. Qui stiamo ridefinendo il metodo new_line()
e aggiungendo un controllo "tipo token" - non lasciando che il checker chiami il metodo check_lines()
se questo è un commento o una stringa (docstring). Poi, nella funzione register()
stiamo sovrascrivendo il built-in FormatChecker
s' new_line()
con la nostra:
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
con --load-plugins
riga di comando argomento:
$ pylint --load-plugins checker script.py
Demo:
senza il plug-in
$ 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)
con il plugin (non si lamenta della 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)
dove script.py
contiene:
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'
Ci sono alcune note che devono essere menzionati:
- questo è troppo complicato, fragile, instabile e magico da sempre utilizzato
- vedere la prima nota
Hai controllato se 'ignorare-lungo linee' prende un regexp multilinea? – fredtantini
Immagino che tu possa circondare le docstring con il commento '# pylint: dis/enable = line-too-long', ma non è divertente né carino. – Evert
Potrebbero non esserci altre opzioni, vedere 'def check_lines (self, lines, i):' source in 'format.py'. Potrebbe essere possibile scrivere un plugin per sovrascriverlo. – simonzack