Bagaimana cara menonaktifkan peringatan Pylint?

267

Saya mencoba menonaktifkan peringatan C0321 ("lebih dari satu pernyataan pada satu baris" - Saya sering meletakkan ifpernyataan dengan hasil garis tunggal pendek pada baris yang sama), dalam Pylint 0.21.1 (jika penting: astng 0.20. 1, umum 0,50,3, Python 2.6.6 (r266: 84292, 15 Sep 2010, 16:22:56)).

Saya sudah mencoba menambahkan disable=C0321dalam file konfigurasi Pylint, tetapi Pylint tetap bersikeras untuk melaporkannya. Variasi pada baris yang (seperti disable=0321atau disable=C321) yang ditandai sebagai kesalahan, sehingga Pylint tidak mengenali pilihan dengan benar, itu hanya mengabaikannya.

Apakah ini bug Pylint, atau saya melakukan sesuatu yang salah? Apakah ada cara untuk mengatasi ini? Saya benar-benar ingin menghilangkan beberapa kebisingan ini.

Kepala Geek
sumber
1
Ada solusi yang baik di sini jika Anda ingin menonaktifkan satu baris kode, tidak semua kesalahan sejenis.
Le Droid

Jawaban:

168

pylint --generate-rcfile menunjukkannya seperti ini:

[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=

Jadi sepertinya Anda ~/.pylintrcharus memiliki disable=baris di bagian dalam [MESSAGES CONTROL].

Chris Morgan
sumber
1
Terima kasih, tetapi sudah, di bagian [MESSAGES CONTROL] seperti yang ditunjukkan di atas. Masih diabaikan.
Kepala Geek
6
@ Head Geek: yah, itu bekerja untuk saya. ~/.pylintrcdengan dua baris, [MESSAGES CONTROL]dan disable=C0321. Itu mencegah pesan itu.
Chris Morgan
Aneh ... versi PyLint yang sama persis?
Kepala Geek
@ Head Geek: 0.21.3, astng 0.20.3 dan common 0.52.1 sebenarnya (terbaru ketika saya menginstalnya, lebih baru dari milik Anda)
Chris Morgan
1
@ Chris Morgan: Ah. Mungkin bug yang sudah diperbaiki, kemudian - Saya menggunakan versi dari repositori Ubuntu. Terima kasih!
Kepala Geek
165

Saya punya masalah ini menggunakan Eclipse dan menyelesaikannya sebagai berikut:

di folder pylint (mis. C:\Python26\Lib\site-packages\pylint), tahan shift, klik kanan dan pilih untuk membuka perintah windows di folder itu. Tipe:

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

Ini menciptakan standard.rcfile konfigurasi. Buka di notepad dan di bawah [MESSAGES CONTROL], batalkan komentar disable=dan tambahkan ID pesan yang ingin Anda nonaktifkan, misalnya:

disable=W0511, C0321

Simpan file, dan di Eclipse-> window-> preferensi-> PyDev-> pylint, di kotak argumen, ketik:

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

Sekarang itu seharusnya bekerja ...


Anda juga dapat menambahkan komentar di bagian atas kode Anda yang akan ditafsirkan oleh pylint:

# pylint: disable=C0321

tautan ke semua kode pesan pylint


Menambahkan mis. --disable-ids=C0321Di kotak argumen tidak berfungsi. Semua pesan pylint yang tersedia disimpan dalam kamus _messages, atribut dari instance pylint.utils.MessagesHandlerMixInkelas. Saat menjalankan pylint dengan argumen --disable-ids=...(setidaknya tanpa file konfigurasi), kamus ini awalnya kosong, meningkatkan pengecualian KeyError dalam pylint ( pylint.utils.MessagesHandlerMixIn.check_message_id(). Dalam Eclipse, Anda dapat melihat pesan kesalahan ini di Konsol Pylint (windows - show view - Console , pilih konsol Pylint dari opsi konsol selain ikon konsol.)

Remi
sumber
2
Tidak, seharusnya tidak. 1) Ini merujuk Eclipse, yang tidak relevan dengan pertanyaan yang diajukan 2) Ini merekomendasikan penonaktifan melalui kode pesan lawas. Saya akan merekomendasikan jawaban saya untuk solusi paling sederhana untuk masalah ini, atau jawaban Chris Johnson untuk lebih jelasnya.
imolit
153

Mulai dari Pylint v. 0.25.3, Anda dapat menggunakan nama simbolis untuk menonaktifkan peringatan alih-alih harus mengingat semua nomor kode itu . Misalnya:

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

Gaya ini lebih instruktif daripada kode kesalahan kriptik, dan juga lebih praktis karena versi Pylint yang lebih baru hanya menampilkan nama simbolik, bukan kode kesalahan.

Korespondensi antara nama dan kode simbolis dapat ditemukan di sini .

Komentar penonaktifan dapat disisipkan pada barisnya sendiri, menerapkan penonaktifan untuk semua yang terjadi setelah di blok yang sama. Atau, itu dapat dimasukkan pada akhir baris yang dimaksudkan untuk diterapkan.

Jika pylint menampilkan Locally disablingpesan " ", Anda dapat menghilangkannya dengan memasukkan cacat locally-disabled terlebih dahulu seperti pada contoh di atas.

imolit
sumber
20
Tetapi menempatkan # pylint: disable=fooinlyne membuat saya berbaris terlalu lama, jadi sekarang saya perlu menambahkan , line-too-long! Lidah di pipi; inilah yang saya butuhkan dan menyelesaikan masalah saya. Terima kasih!
dwanderson
Daftar dengan string aktual untuk digunakan: gist.github.com/m451/965bb613177dd4fa896b815aa0e0e365
masi
81

Untuk menonaktifkan peringatan secara lokal di blok, tambahkan

# pylint: disable=C0321

ke blok itu.

thakis
sumber
5
Ini adalah teknik warisan dan tidak lagi direkomendasikan. Lihat jawaban lainnya.
Acumenus
1
Maksud Anda orang harus menggunakan nama simbolis alih-alih nomor kode, ya?
thakis
5
Iya. The jawaban dengan imolit mencakup persis ini.
Acumenus
2
Bagaimana cara menemukan nama simbolis? Editor saya akan meludah [pylint] C0111: Missing method docstring, jadi menemukan nomor kode itu mudah, tetapi menemukan nama simbolis berarti saya harus mencarinya.
Adam Parkin
@AdamParkin Saya menemukan pesan saya di sini: pylint-messages.wikidot.com/all-messages
Jean-Francois T.
81

Ada beberapa cara untuk menonaktifkan peringatan & kesalahan dari Pylint. Yang mana yang harus digunakan berkaitan dengan seberapa global atau lokal Anda ingin menerapkan kecacatan - keputusan desain yang penting.

Berbagai Pendekatan

  1. Dalam satu atau lebih pylintrcfile.

Ini melibatkan lebih dari ~/.pylintrcfile (dalam direktori $ HOME Anda) seperti yang dijelaskan oleh Chris Morgan. Pylint akan mencari file rc, dengan prioritas yang lebih menghargai file "lebih dekat":

  • Sebuah pylintrcfile dalam direktori kerja saat ini; atau

  • Jika direktori kerja saat ini dalam modul Python (yaitu berisi __init__.pyfile), mencari hierarki modul Python sampai pylintrcfile ditemukan; atau

  • File dinamai oleh variabel lingkungan PYLINTRC; atau

  • Jika Anda memiliki direktori home yang bukan /root:

    • ~/.pylintrc; atau

    • ~/.config/pylintrc; atau

    • /etc/pylintrc

Perhatikan bahwa sebagian besar file ini diberi nama pylintrc- hanya file dalam yang ~memiliki titik terkemuka.

Ke pylintrcfile Anda , tambahkan baris untuk menonaktifkan pesan pylint tertentu. Sebagai contoh:

[MESSAGES CONTROL]
disable=locally-disabled
  1. Lebih lanjut menonaktifkan dari pylintbaris perintah, seperti yang dijelaskan oleh Aboo dan Cairnarvon. Ini seperti pylint --disable=bad-builtin. Ulangi --disableuntuk menekan item tambahan.

  2. Lebih lanjut menonaktifkan dari baris kode Python individu, seperti yang dijelaskan oleh Imolit. Ini terlihat seperti some statement # pylint: disable=broad-except(komentar tambahan di akhir baris sumber asli) dan hanya berlaku untuk baris saat ini . Pendekatan saya adalah untuk selalu meletakkan ini di akhir baris kode lain sehingga mereka tidak akan bingung dengan gaya blok, lihat di bawah.

  3. Lebih lanjut menonaktifkan didefinisikan untuk blok kode Python yang lebih besar, hingga menyelesaikan file sumber.

    • Ini terlihat seperti # pragma pylint: disable=bad-whitespace(perhatikan pragmakata kuncinya).

    • Ini berlaku untuk setiap baris setelah pragma. Menempatkan blok ini di bagian atas file membuat penindasan berlaku untuk seluruh file. Menempatkan blok yang sama lebih rendah dalam file membuatnya berlaku hanya untuk baris yang mengikuti blok. Pendekatan saya adalah untuk selalu menempatkan ini pada baris mereka sendiri sehingga mereka tidak akan bingung dengan gaya single-line, lihat di atas.

    • Ketika penindasan seharusnya hanya berlaku dalam rentang kode, gunakan # pragma pylint: enable=bad-whitespace(sekarang menggunakan enabletidakdisable ) untuk berhenti menekan.

Perhatikan bahwa penonaktifan untuk satu baris menggunakan # pylintsintaks sementara penonaktifan untuk baris ini dan seterusnya menggunakan # pragma pylintsintaksis. Ini mudah membingungkan terutama ketika menyalin & menempel.

Menyatukan Semuanya

Saya biasanya menggunakan campuran pendekatan ini.

  • Saya menggunakan ~/.pylintrcuntuk standar yang benar-benar global - sangat sedikit di antaranya.

  • Saya menggunakan tingkat proyek pylintrcpada tingkat yang berbeda dalam modul Python ketika ada standar khusus proyek. Terutama ketika Anda menerima kode dari orang atau tim lain, Anda mungkin menemukan mereka menggunakan konvensi yang tidak Anda sukai, tetapi Anda tidak ingin mengerjakan ulang kode tersebut. Menjaga pengaturan pada level ini membantu tidak menyebarkan praktik-praktik tersebut ke proyek lain.

  • Saya menggunakan pragma gaya blok di bagian atas file sumber tunggal. Saya suka mematikan pragma (berhenti menekan pesan) di tengah panasnya pengembangan bahkan untuk standar Pylint yang tidak saya setujui (seperti "terlalu sedikit metode publik" - Saya selalu mendapatkan peringatan tentang kelas pengecualian khusus) - tetapi sangat membantu untuk melihat lebih banyak / mungkin semua pesan Pylint saat Anda sedang berkembang. Dengan begitu Anda dapat menemukan kasus yang ingin Anda atasi dengan pragma satu jalur (lihat di bawah), atau cukup tambahkan komentar untuk pengembang berikutnya untuk menjelaskan mengapa peringatan itu OK dalam kasus ini.

  • Saya membiarkan beberapa pragma gaya blok diaktifkan walaupun kode sudah siap untuk check-in. Saya mencoba menggunakan beberapa di antaranya, tetapi ketika masuk akal untuk modul, tidak apa-apa untuk melakukan dokumentasi. Namun saya mencoba untuk meninggalkan sesedikit mungkin, lebih disukai tidak ada.

  • Saya menggunakan gaya single-line-comment untuk mengatasi kesalahan yang sangat potensial. Sebagai contoh, jika ada tempat di mana itu benar-benar masuk akal untuk dilakukan except Exception as exc, saya meletakkan # pylint: disable=broad-exceptgaris itu daripada pendekatan yang lebih global karena ini adalah pengecualian aneh dan perlu dipanggil, pada dasarnya sebagai bentuk dokumentasi.


Seperti semua hal lain dalam Python, Anda dapat bertindak pada berbagai tingkat tipuan. Saran saya adalah untuk memikirkan apa yang termasuk dalam level apa sehingga Anda tidak berakhir dengan pendekatan yang terlalu lunak untuk Pylint.

Chris Johnson
sumber
1
Jawaban terbaik, mirip dengan stackoverflow.com/questions/16266452/…
Christophe Roussy
1
Untuk sebagian besar, saya tidak bisa menganjurkan menggunakan global nonempty ~/.pylintrc. IMHO, konfigurasi biasanya harus diikat ke proyek, dan itu harus di suatu tempat di dalam proyek. Hanya dengan demikian dapat dikontrol versi dan dibagikan dengan proyek. Gagal ini, klon mungkin tidak memiliki kustomisasi yang diperlukan untuk pylint untuk keluar tanpa mencetak pesan.
Acumenus
@ABB Saya pikir itu bijaksana
Chris Johnson
3
@ ChrisJohnson Awalan pragma sepertinya sama sekali tidak perlu. Sebagai contoh, saya ada # pylint: disable=missing-docstringdi bagian atas file saya, dan itu berlaku untuk seluruh sisa file. Silakan periksa dan hapus pragmaawalan dari jawaban Anda.
Acumenus
FAQ Pylint tidak menulis tentang pragma apa pun. ( pylint.pycqa.org/en/latest/… ): Anda dapat menonaktifkan atau mengaktifkan (dinonaktifkan secara global) pesan di tingkat modul dengan menambahkan opsi yang sesuai dalam komentar di bagian atas file: # pylint: disable = wildcard- impor, metode-disembunyikan # pylint: enable = too-many-lines
Yaroslav Nikitenko
19

Anda juga dapat menggunakan perintah berikut:

pylint --disable=C0321  test.py

Versi pylint saya adalah 0.25.1.

aboo
sumber
Ini sekarang merupakan teknik warisan. Disarankan menggunakan nama simbolis dari peringatan yang dinonaktifkan. Lihat jawaban ini .
Acumenus
Ini tampaknya tidak berfungsi dengan --py3kbaik :(
DylanYoung
Cukup menarik, itu berfungsi dengan baik jika disediakan dalam rcfile, dan (lebih bermasalah) itu benar-benar menghasilkan rcfile yang benar --generate-rcfile. Harus mendapatkan kode cinta dengan beberapa cabang yang melakukan hal yang sama :(
DylanYoung
18

Ini adalah FAQ :

4.1 Apakah mungkin untuk menonaktifkan pesan tertentu secara lokal?

Ya, fitur ini telah ditambahkan di Pylint 0.11. Ini dapat dilakukan dengan menambahkan
# pylint: disable=some-message,another-onepada level blok yang diinginkan atau di akhir baris kode yang diinginkan.

4.2 Apakah ada cara untuk menonaktifkan pesan hanya untuk modul tertentu?

Ya, Anda dapat menonaktifkan atau mengaktifkan pesan (dinonaktifkan secara global) di tingkat modul dengan menambahkan opsi yang sesuai dalam komentar di bagian atas file:

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

Anda dapat menonaktifkan pesan dengan:

  • numerik ID: E1101,E1102 dll
  • pesan simbolik: no-member, undefined-variabledll
  • nama sekelompok cek. Anda bisa mengambilnya pylint --list-groups.
  • kategori cek: C, R, W, dll
  • semua cek dengan all.

Lihat dokumen (atau jalankan pylint --list-msgsdi terminal) untuk daftar lengkap pylintpesan. Dokumen juga memberikan contoh yang bagus tentang bagaimana menggunakan fitur ini.

Eugene Yarmash
sumber
5

Anda hanya perlu menambahkan satu baris untuk menonaktifkan apa yang ingin Anda nonaktifkan. Misalnya

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

Tambahkan ini di # 1 di modul Anda

Chetan Malhotra
sumber
4

Dalam hal ini membantu seseorang, jika Anda menggunakan Visual Studio Code, ia mengharapkan file berada dalam pengkodean UTF8. Untuk menghasilkan file, saya berlari pylint --generate-rcfile | out-file -encoding utf8 .pylintrcdi PowerShell.

Elijah W. Gagne
sumber
0

Sesuai dokumentasi pylint , yang paling mudah adalah menggunakan bagan ini :

  • Pemeriksaan terkait konvensi C
  • R refactoring terkait cek
  • Berbagai peringatan
  • Kesalahan E, untuk kemungkinan bug dalam kode
  • F fatal, jika terjadi kesalahan yang mencegah pylint melakukan pemrosesan lebih lanjut.

Jadi seseorang dapat menggunakan:

pylint -j 0 --disable=I,E,R,W,C,F YOUR_FILES_LOC
Arindam Roychowdhury
sumber
-1

Sintaksis python mengizinkan lebih dari satu pernyataan pada satu baris, dipisahkan oleh tanda titik koma (;). Namun, membatasi setiap baris ke satu pernyataan memudahkan manusia untuk mengikuti logika program saat membacanya.

Jadi, cara lain untuk memecahkan masalah ini, adalah untuk memahami mengapa pesan serat ada di sana dan tidak menempatkan lebih dari satu pernyataan pada satu baris.

Ya, Anda mungkin merasa lebih mudah untuk menulis beberapa pernyataan per baris, namun pylint untuk setiap pembaca kode Anda bukan hanya Anda.

jam
sumber
-1

Anda mungkin ingin mencoba ini:

Sunting "C: \ Users \ User \ AppData \ Roaming \ Code \ User \ settings.json" dan tambahkan python.linting.pylintArgsbaris di akhir seperti yang ditunjukkan di bawah ini:

{
    "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"
    ],
}
aarw76
sumber