2014-12-31 24 views
12

Cân nhắc đoạn mã này:pylint: Tránh kiểm tra INSIDE docstrings (chỉ thị toàn cầu/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 đầu ra:

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

Có bất kỳ chỉ thị sẵn (rcfile) để loại trừ CHỈDOCSTRINGS từ kiểm tra pylint?

Một multilineregex cho ignore-long-lines (Cảm ơn@fredtantini) dường như bị bỏ qua.

Xung quanh docstrings với # pylint: dis/enable=line-too-long (Cảm ơn@Evert) sẽ gây ra hiệu ứng cần thiết, tuy nhiên, tôi đang tìm một chỉ thị toàn cầu để làm cho lừa.

+1

Bạn kiểm tra nếu 'bỏ qua-dài lines' mất một regexp multiline? – fredtantini

+1

Tôi đoán bạn có thể bao quanh docstrings với nhận xét '# pylint: dis/enable = line-too-long', nhưng đó không phải là niềm vui hay cũng không đẹp. – Evert

+1

Có thể không còn tùy chọn nào nữa, xem 'def check_lines (tự, dòng, i):' nguồn trong 'format.py'. Có thể viết một plugin để ghi đè điều đó. – simonzack

Trả lời

4

Vấn đề là điều bạn đang hỏi là không thể định cấu hình ở tất cả. Ngoài ra, theo số PEP8:

Giới hạn tất cả các dòng tối đa 79 ký tự.

Đối với các khối văn bản dài dòng có hạn chế cấu trúc ít hơn (tài liệu hoặc nhận xét), độ dài dòng phải được giới hạn ở 72 ký tự.

Điều đó nói rằng, hãy phân tích the source code và xem chúng tôi có thể đưa ra giải pháp hay không. Người kiểm tra chịu trách nhiệm kiểm tra độ dài dòng được gọi là FormatChecker - nó cũng kiểm tra các cấu trúc mã thụt đầu dòng và mã trái phép.

Các hai phương pháp có liên quan chúng ta quan tâm:

Như bạn có thể nhìn thấy "dòng quá lâu" thông báo lỗi là được thêm vào đây:

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 ở đây đề cập đến cài đặt biểu thức chính quy ignore-long-lines, theo mặc định, bằng ^\s*(#)?<?https?://\S+>?$ - điều này sẽ giúp trong trường hợp có các liên kết http bên trong chuỗi (doc) - không có lỗi nào được ném.

Nói cách khác, chỉ có cài đặt ignore-long-lines có thể ngăn không cho quá trình áp dụng kiểm tra "quá dài".

Cũng lưu ý một thực tế thú vị: các tiện ích kiểm tra pylint mã chất lượng có docstring sai lầm này:

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

trong khi phương pháp này cũng kiểm tra cho missing-final-newlinetrailing-whitespace. Đây là một cái gì đó bạn sẽ không bao giờ bắt tĩnh - lỗi của con người mà có thể được nhận thấy và cố định bởi một con người duy nhất.


Tôi không thích những đề nghị sau đây, nhưng chúng ta có thể khỉ vá các FormatChecker on the fly.

Tạo tập lệnh có tên "checker.py" và đặt nó trên PYTHONPATH. Ở đây chúng tôi đang xác định lại phương pháp new_line() và thêm một kiểm tra "loại mã thông báo" - không cho phép người kiểm tra gọi phương thức check_lines() nếu đây là nhận xét hoặc chuỗi (docstring). Sau đó, trong register() chức năng chúng ta đang trọng được xây dựng trong FormatChecker 's new_line() với chúng ta:

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 với lập luận --load-plugins dòng lệnh:

$ pylint --load-plugins checker script.py 

Demo:

  • không có 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) 
    
  • với các plugin (không phàn nàn về 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) 
    

nơi script.py chứa:

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' 

Có vài lưu ý rằng cần phải được đề cập:

  • đây là quá phức tạp, mong manh, không ổn định và huyền diệu được từng sử dụng
  • xem lưu ý đầu tiên
Các vấn đề liên quan