Làm cách nào để tắt cảnh báo Pylint?


267

Tôi đang cố gắng vô hiệu hóa cảnh báo C0321 ("nhiều hơn một câu lệnh trên một dòng" - Tôi thường đặt các ifcâu lệnh có kết quả một dòng ngắn trên cùng một dòng), trong Pylint 0.21.1 (nếu có vấn đề: astng 0.20. 1, phổ biến 0,50.3, Python 2.6.6 (r266: 84292, ngày 15 tháng 9 năm 2010, 16:22:56)).

Tôi đã thử thêm disable=C0321vào tệp cấu hình Pylint, nhưng Pylint vẫn khăng khăng báo cáo về nó. Biến thể trên dòng đó (như disable=0321hoặc disable=C321) được gắn cờ là lỗi, vì vậy Pylint không nhận ra tùy chọn đúng, nó chỉ bỏ qua nó.

Đây có phải là lỗi của Pylint không, hay tôi đang làm gì đó sai? Có cách nào để khắc phục điều này? Tôi thực sự muốn loại bỏ một số tiếng ồn này.


1
Có một giải pháp tốt ở đây nếu bạn muốn vô hiệu hóa một dòng mã, không phải tất cả các lỗi thuộc loại.
Le Droid

Câu trả lời:


168

pylint --generate-rcfile cho thấy nó như thế này:

[MESSAGES CONTROL]

# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple time.
#enable=

# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifier separated by comma (,) or put this option
# multiple time (only on the command line, not in the configuration file where
# it should appear only once).
#disable=

Vì vậy, có vẻ như bạn ~/.pylintrcnên có disable=dòng / s trong đó trong một phần [MESSAGES CONTROL].


1
Cảm ơn, nhưng nó đã làm, trong phần [KIỂM SOÁT TIN NHẮN] như được hiển thị ở trên. Vẫn mặc kệ.
Head Geek

6
@Head Geek: tốt, nó làm việc cho tôi. ~/.pylintrcvới hai dòng, [MESSAGES CONTROL]disable=C0321. Điều đó ngăn chặn thông điệp đó.
Chris Morgan

Lạ ... phiên bản chính xác của PyLint?
Head Geek

@Head Geek: 0.21.3, astng 0.20.3 và phổ biến 0.52.1 (mới nhất khi tôi cài đặt nó, gần đây hơn của bạn)
Chris Morgan

1
@Chris Morgan: À. Có lẽ là một lỗi đã được sửa, sau đó - Tôi đang sử dụng phiên bản từ kho lưu trữ của Ubuntu. Cảm ơn!
Head Geek

165

Tôi đã gặp vấn đề này khi sử dụng Eclipse và giải quyết nó như sau:

trong thư mục pylint (ví dụ C:\Python26\Lib\site-packages\pylint), giữ shift, nhấp chuột phải và chọn để mở lệnh windows trong thư mục đó. Kiểu:

lint.py --generate-rcfile > standard.rc

Điều này tạo ra standard.rctập tin cấu hình. Mở nó trong notepad và bên dưới [MESSAGES CONTROL], bỏ ghi chú disable=và thêm ID tin nhắn bạn muốn tắt, ví dụ:

disable=W0511, C0321

Lưu tệp và trong Eclipse-> window-> Preferences-> PyDev-> pylint, trong hộp đối số, gõ:

--rcfile=C:\Python26\Lib\site-packages\pylint\standard.rc

Bây giờ nó sẽ hoạt động ...


Bạn cũng có thể thêm một nhận xét ở đầu mã của bạn sẽ được giải thích bởi pylint:

# pylint: disable=C0321

liên kết đến tất cả các mã tin nhắn pylint


Thêm ví dụ --disable-ids=C0321trong hộp đối số không hoạt động. Tất cả các thông điệp pylint có sẵn được lưu trữ trong từ điển _messages, một thuộc tính của một thể hiện của pylint.utils.MessagesHandlerMixInlớp. Khi chạy pylint với đối số --disable-ids=...(ít nhất là không có tệp cấu hình), từ điển này ban đầu trống, đưa ra một ngoại lệ KeyError trong pylint ( pylint.utils.MessagesHandlerMixIn.check_message_id(). Trong Eclipse, bạn có thể thấy thông báo lỗi này trong Bảng điều khiển Pylint (cửa sổ - hiển thị chế độ xem - Bảng điều khiển , chọn Bảng điều khiển Pylint từ các tùy chọn bảng điều khiển bên cạnh biểu tượng bảng điều khiển.)


2
Không, nó thực sự không nên. 1) Nó tham chiếu Eclipse, không liên quan đến câu hỏi được hỏi 2) Nó khuyến nghị vô hiệu hóa thông qua các mã thông báo cũ. Tôi muốn giới thiệu câu trả lời của tôi cho giải pháp đơn giản nhất cho vấn đề, hoặc câu trả lời của Chris Johnson để biết thêm chi tiết.
imolit

153

Bắt đầu từ Pylint v. 0.25.3, bạn có thể sử dụng các tên tượng trưng để vô hiệu hóa các cảnh báo thay vì phải nhớ tất cả các số mã đó . Ví dụ:

# pylint: disable=locally-disabled, multiple-statements, fixme, line-too-long

Phong cách này mang tính hướng dẫn nhiều hơn mã lỗi mã hóa và cũng thực tế hơn vì các phiên bản mới hơn của Pylint chỉ xuất ra tên tượng trưng, ​​không phải mã lỗi.

Sự tương ứng giữa tên tượng trưng và mã có thể được tìm thấy ở đây .

Một bình luận vô hiệu hóa có thể được chèn vào dòng riêng của nó, áp dụng vô hiệu hóa cho mọi thứ xuất hiện trong cùng một khối. Ngoài ra, nó có thể được chèn vào cuối dòng mà nó có nghĩa là áp dụng.

Nếu pylint xuất ra Locally disablingcác thông báo "", bạn có thể loại bỏ chúng bằng cách bao gồm tắt locally-disabled trước như trong ví dụ trên.


20
Nhưng đặt # pylint: disable=fooinlyne khiến tôi xếp hàng quá lâu, vì vậy bây giờ tôi cần thêm , line-too-long! Lưỡi trong má; đây là những gì tôi cần và giải quyết vấn đề của tôi. Cảm ơn!
lùn

Danh sách với các chuỗi thực tế để sử dụng: gist.github.com/m451/965bb613177dd4fa896b815aa0e0e365
masi

81

Để tắt cảnh báo cục bộ trong một khối, hãy thêm

# pylint: disable=C0321

đến khối đó.


5
Đây là một kỹ thuật kế thừa và không còn được khuyến khích. Xem các câu trả lời khác.
Acumenus

1
Bạn có nghĩa là người ta nên sử dụng tên tượng trưng thay vì số mã, đúng không?
thakis

5
Đúng. Câu trả lời của imolit bao gồm chính xác điều này.
Acumenus

2
Làm thế nào để tìm thấy một cái tên tượng trưng? Trình soạn thảo của tôi sẽ nhổ ra [pylint] C0111: Missing method docstring, vì vậy việc tìm số mã rất dễ dàng, nhưng tìm tên tượng trưng có nghĩa là tôi phải tìm nó.
Adam Parkin

@AdamParkin Tôi tìm thấy tin nhắn của mình ở đây: pylint-messages.wikidot.com/all-messages
Jean-Francois T.

80

Có một số cách để vô hiệu hóa cảnh báo & lỗi từ Pylint. Việc sử dụng cái nào phải liên quan đến việc bạn muốn áp dụng cách giải quyết trên toàn cầu hoặc cục bộ như thế nào - một quyết định thiết kế quan trọng.

Nhiều cách tiếp cận

  1. Trong một hoặc nhiều pylintrctệp.

Điều này liên quan đến nhiều hơn ~/.pylintrctập tin (trong thư mục $ HOME của bạn) như được mô tả bởi Chris Morgan. Pylint sẽ tìm kiếm các tệp RC, với quyền ưu tiên là các tệp "gần gũi" cao hơn:

  • Một pylintrctập tin trong thư mục làm việc hiện tại; hoặc là

  • Nếu thư mục làm việc hiện tại nằm trong một mô-đun Python (tức là nó chứa một __init__.py tệp), tìm kiếm cấu trúc phân cấp của các mô-đun Python cho đến khi pylintrctìm thấy một tệp; hoặc là

  • Tệp được đặt tên theo biến môi trường PYLINTRC; hoặc là

  • Nếu bạn có một thư mục nhà không /root :

    • ~/.pylintrc; hoặc là

    • ~/.config/pylintrc; hoặc là

    • /etc/pylintrc

Lưu ý rằng hầu hết các tệp này được đặt tên pylintrc - chỉ tệp trong đó ~có dấu chấm hàng đầu.

pylintrcVào tệp của bạn , thêm dòng để vô hiệu hóa các thông báo cụ thể. Ví dụ:

[MESSAGES CONTROL]
disable=locally-disabled
  1. pylintVô hiệu hóa thêm từ dòng lệnh, như được mô tả bởi Aboo và Cairnarvon. Điều này trông giống như pylint --disable=bad-builtin. Lặp lại --disableđể triệt tiêu các mục bổ sung.

  2. Vô hiệu hóa thêm từ các dòng mã Python riêng lẻ, như được mô tả bởi Imolit. Chúng trông giống như some statement # pylint: disable=broad-except(nhận xét thêm vào cuối dòng nguồn gốc) và chỉ áp dụng cho dòng hiện tại . Cách tiếp cận của tôi là luôn đặt chúng ở cuối các dòng mã khác để chúng không bị nhầm lẫn với kiểu khối, xem bên dưới.

  3. Vô hiệu hóa thêm được xác định cho các khối mã Python lớn hơn, cho đến khi hoàn thành các tệp nguồn.

    • Chúng trông giống như # pragma pylint: disable=bad-whitespace (lưu ý pragmatừ khóa).

    • Những điều này áp dụng cho mọi dòng sau pragma. Đặt một khối trong số này ở đầu tệp sẽ áp dụng triệt tiêu cho toàn bộ tệp. Đặt cùng một khối thấp hơn trong tệp làm cho chúng chỉ áp dụng cho các dòng theo sau khối. Cách tiếp cận của tôi là luôn đặt những thứ này trên một dòng riêng để chúng không bị nhầm lẫn với kiểu một dòng, xem ở trên.

    • Khi việc triệt tiêu chỉ nên áp dụng trong một khoảng mã, hãy sử dụng # pragma pylint: enable=bad-whitespace(hiện enablekhông sử dụng disable) để dừng triệt tiêu.

Lưu ý rằng việc vô hiệu hóa cho một dòng sử dụng # pylintcú pháp trong khi vô hiệu hóa cho dòng này trở đi sử dụng# pragma pylint cú pháp. Đây là những dễ nhầm lẫn đặc biệt là khi sao chép và dán.

Để tất cả chúng cùng nhau

Tôi thường sử dụng kết hợp các phương pháp này.

  • Tôi sử dụng ~/.pylintrccho các tiêu chuẩn hoàn toàn toàn cầu - rất ít trong số này.

  • Tôi sử dụng cấp dự án pylintrcở các cấp khác nhau trong các mô-đun Python khi có các tiêu chuẩn dành riêng cho dự án. Đặc biệt là khi bạn nhận mã từ người hoặc nhóm khác, bạn có thể thấy họ sử dụng các quy ước mà bạn không thích, nhưng bạn không muốn làm lại mã. Giữ các cài đặt ở cấp độ này giúp không lan truyền các thực tiễn đó sang các dự án khác.

  • Tôi sử dụng các pragmas kiểu khối ở đầu các tệp nguồn đơn. Tôi muốn tắt các pragma (ngừng triệt tiêu các thông điệp) trong sức nóng của sự phát triển ngay cả đối với các tiêu chuẩn Pylint mà tôi không đồng ý (như "quá ít phương thức công khai" - tôi luôn nhận được cảnh báo đó về các lớp Ngoại lệ tùy chỉnh) - nhưng Thật hữu ích khi thấy nhiều hơn / có thể tất cả các tin nhắn Pylint trong khi bạn đang phát triển. Bằng cách đó, bạn có thể tìm thấy các trường hợp bạn muốn giải quyết bằng các pragma một dòng (xem bên dưới) hoặc chỉ cần thêm nhận xét cho nhà phát triển tiếp theo để giải thích tại sao cảnh báo đó là OK trong trường hợp này.

  • Tôi để lại một số pragma kiểu khối được bật ngay cả khi mã đã sẵn sàng để đăng nhập. Tôi cố gắng sử dụng một vài trong số đó, nhưng khi nó có ý nghĩa đối với mô-đun, bạn có thể làm tài liệu. Tuy nhiên, tôi cố gắng để lại càng ít càng tốt, tốt nhất là không có.

  • Tôi sử dụng kiểu nhận xét một dòng để giải quyết các lỗi đặc biệt mạnh. Ví dụ, nếu có một nơi thực sự có ý nghĩa để làm except Exception as exc, tôi đặt # pylint: disable=broad-exceptdòng đó thay vì cách tiếp cận toàn cầu hơn vì đây là một ngoại lệ lạ và cần được gọi ra, về cơ bản là một dạng tài liệu.


Giống như mọi thứ khác trong Python, bạn có thể hành động ở các cấp độ khác nhau. Lời khuyên của tôi là suy nghĩ về những gì thuộc về cấp độ nào để bạn không kết thúc với một cách tiếp cận quá khoan dung đối với Pylint.


1
Câu trả lời hay nhất, tương tự như stackoverflow.com/questions/16266452/ Cách
Barshe Roussy

1
Đối với hầu hết các phần tôi không thể ủng hộ bằng cách sử dụng một nonempty toàn cầu ~/.pylintrc. IMHO, cấu hình thường được gắn với dự án, và vì vậy nó phải ở đâu đó trong dự án. Chỉ sau đó nó có thể được kiểm soát phiên bản và chia sẻ với dự án. Không thực hiện được điều này, một bản sao có thể thiếu các tùy chỉnh cần thiết để pylint thoát ra mà không in thông điệp.
Acumenus

@ABB Tôi nghĩ điều đó thật khôn ngoan
Chris Johnson

3
@ChrisJohnson Tiền tố pragma dường như hoàn toàn không cần thiết. Ví dụ: tôi có # pylint: disable=missing-docstringở đầu tệp của mình và nó áp dụng cho toàn bộ phần còn lại của tệp. Vui lòng kiểm tra và loại bỏ pragmatiền tố từ câu trả lời của bạn.
Acumenus

FAQ Pylint không viết về bất kỳ pragma. ( pylint.pycqa.org/en/latest/ . nhập khẩu, ẩn phương thức # pylint: enable = too-many-lines
Yaroslav Nikitenko

18

Bạn cũng có thể sử dụng lệnh sau:

pylint --disable=C0321  test.py

Phiên bản môn vị của tôi là 0,25.1.


Đây là một kỹ thuật kế thừa. Thay vào đó, nên sử dụng tên tượng trưng của cảnh báo bị vô hiệu hóa. Xem câu trả lời này .
Acumenus

Điều này dường như không hoạt động với --py3kcờ :(
DylanYoung

Thật thú vị, nó hoạt động tốt nếu được cung cấp trong rctệp và (rắc rối hơn) nó thực sự tạo ra một rctệp chính xác với --generate-rcfile. Phải yêu mã với nhiều chi nhánh làm cùng một việc :(
DylanYoung

18

Đây là một câu hỏi thường gặp :

4.1 Có thể vô hiệu hóa cục bộ một tin nhắn cụ thể không?

Có, tính năng này đã được thêm vào trong Pylint 0.11. Điều này có thể được thực hiện bằng cách thêm
# pylint: disable=some-message,another-oneở cấp độ khối mong muốn hoặc ở cuối dòng mã mong muốn.

4.2 Có cách nào để vô hiệu hóa một tin nhắn chỉ cho một mô-đun cụ thể không?

Có, bạn có thể tắt hoặc bật thông báo (bị vô hiệu hóa toàn cầu) ở cấp mô-đun bằng cách thêm tùy chọn tương ứng trong một nhận xét ở đầu tệp:

# pylint: disable=wildcard-import, method-hidden
# pylint: enable=too-many-lines

Bạn có thể tắt tin nhắn bằng cách:

  • ID số : E1101, E1102v.v.
  • thông điệp tượng trưng : no-member, undefined-variablev.v.
  • tên của một nhóm kiểm tra. Bạn có thể lấy những người với pylint --list-groups.
  • chủng loại kiểm tra: C, R, Wvv
  • tất cả các kiểm tra với all.

Xem tài liệu (hoặc chạy pylint --list-msgstrong thiết bị đầu cuối) để biết danh sách đầy đủ pylintcác tin nhắn. Các tài liệu cũng cung cấp một ví dụ hay về cách sử dụng tính năng này.


5

Bạn chỉ cần thêm một dòng để tắt những gì bạn muốn tắt. Ví dụ

#pylint: disable = line-too-long, too-many-lines, no-name-in-module, import-error, multiple-imports, pointless-string-statement, wrong-import-order

Thêm cái này ở số 1 trong mô-đun của bạn


4

Trong trường hợp điều này giúp được ai đó, nếu bạn đang sử dụng Visual Studio Code, nó hy vọng tệp sẽ được mã hóa UTF8. Để tạo tệp, tôi đã chạy pylint --generate-rcfile | out-file -encoding utf8 .pylintrctrong PowerShell.


0

Theo pylint tài liệu, đơn giản nhất là sử dụng điều này biểu đồ :

  • C hội nghị kiểm tra liên quan
  • R tái cấu trúc kiểm tra liên quan
  • W cảnh báo khác nhau
  • Lỗi E, đối với các lỗi có thể xảy ra trong mã
  • F gây tử vong, nếu xảy ra lỗi khiến cho pylint không thể xử lý thêm.

Vì vậy, người ta có thể sử dụng:

pylint -j 0 --disable=I,E,R,W,C,F YOUR_FILES_LOC

-1

Cú pháp Python cho phép nhiều hơn một câu lệnh trên một dòng, được phân tách bằng dấu chấm phẩy (;). Tuy nhiên, việc giới hạn mỗi dòng trong một câu lệnh giúp con người dễ dàng tuân theo logic của chương trình hơn khi đọc qua nó.

Vì vậy, một cách khác để giải quyết vấn đề này, là để hiểu lý do tại sao thông điệp lint ở đó và không đặt nhiều hơn một tuyên bố trên một dòng.

Có, bạn có thể thấy việc viết nhiều câu lệnh trên mỗi dòng dễ dàng hơn, tuy nhiên, pylint dành cho mọi người đọc mã khác của bạn chứ không chỉ riêng bạn.


-1

Bạn có thể muốn thử điều này:

Chỉnh sửa "C: \ Users \ Người dùng của bạn \ AppData \ Roaming \ Code \ User \ settings.json" và thêm python.linting.pylintArgscác dòng ở cuối như hiển thị bên dưới:

{
    "team.showWelcomeMessage": false,
    "python.dataScience.sendSelectionToInteractiveWindow": true,
    "git.enableSmartCommit": true,
    "powershell.codeFormatting.useCorrectCasing": true,
    "files.autoSave": "onWindowChange",
    "python.linting.pylintArgs": [
        "--load-plugins=pylint_django",
        "--errors-only"
    ],
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.