2014-12-31 20 views
12

considerare questo pezzo di codice:pylint: evitare di controllare INSIDE docstrings (direttiva globale/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 uscita:

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

C'è qualche direttiva available (rcfile) escludere SOLODOCSTRINGS dal correttore pylint?

Un multilinearegex per ignore-long-lines (Grazie@fredtantini) sembra essere ignorato.

circostante docstrings con # pylint: dis/enable=line-too-long (Grazie@Evert) farà sì che il risultato richiesto, però, sto cercando di direttiva globale per fare il trucco .

+1

Hai controllato se 'ignorare-lungo linee' prende un regexp multilinea? – fredtantini

+1

Immagino che tu possa circondare le docstring con il commento '# pylint: dis/enable = line-too-long', ma non è divertente né carino. – Evert

+1

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

risposta

4

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