Saya menjalankan pylint pada beberapa kode, dan menerima pesan kesalahan "Metode publik terlalu sedikit (0/2)". apa maksud dari pesan ini? Itu pylint tidak membantu:
Digunakan ketika kelas memiliki terlalu sedikit metode publik, jadi pastikan itu sangat berharga.
Jawaban:
Kesalahan pada dasarnya mengatakan bahwa kelas tidak dimaksudkan untuk hanya menyimpan data, karena pada dasarnya Anda memperlakukan kelas sebagai kamus. Kelas harus memiliki setidaknya beberapa metode untuk mengoperasikan data yang mereka pegang.
Jika kelas Anda terlihat seperti ini:
Pertimbangkan untuk menggunakan kamus atau
namedtuple
gantinya. Meskipun jika suatu kelas tampaknya pilihan terbaik, gunakanlah. pylint tidak selalu tahu yang terbaik.Perhatikan bahwa
namedtuple
itu tidak dapat diubah dan nilai yang ditetapkan pada instansiasi tidak dapat diubah nanti.sumber
dict
ataunamedtuple
. Gunakan kelas ketika Anda ingin menambahkan beberapa logika ke objek Anda (misalnya, Anda ingin hal-hal terjadi saat dibuat, Anda memerlukan beberapa hal khusus yang terjadi ketika ditambahkan, Anda ingin melakukan beberapa operasi padanya, mengontrol bagaimana ditampilkan, dll.)namedtuple
menyebalkan - selain memiliki sintaks yang jelek, Anda tidak dapat mendokumentasikannya atau memberikan nilai default dengan mudah.namedtuple
saya menyesali keputusan itu. Tidak konsisten untuk mengizinkan atribut akses bernama dan akses terindeks.Jika Anda memperluas kelas, saran saya adalah menonaktifkan peringatan ini secara sistematis dan melanjutkan, misalnya, dalam kasus tugas Celery:
Bahkan jika Anda hanya memperluas satu fungsi, Anda pasti membutuhkan kelas untuk membuat fungsi teknik ini, dan memperluas jelas lebih baik daripada meretas kelas pihak ketiga!
sumber
min-public-methods=0
di[BASIC]
bagian file konfigurasi. Ini memungkinkan Anda meletakkannya di baris terpisah dari semuadisable=
barang Anda (di[MESSAGE CONTROL]
) yang menurut saya mempermudah menambahkan komentar mendetail tentang mengapa Anda mengaktifkan dan menonaktifkan hal-hal bersama dengan perubahan konfigurasi.Ini adalah kasus lain dari
pylint
aturan buta."Kelas tidak dimaksudkan untuk menyimpan data" - ini adalah pernyataan yang salah. Kamus tidak bagus untuk segalanya. Anggota data kelas adalah sesuatu yang berarti, item kamus adalah sesuatu yang opsional. Bukti: Anda dapat melakukannya
dictionary.get('key', DEFAULT_VALUE)
untuk mencegahKeyError
, tetapi tidak ada yang sederhana__getattr__
dengan default.EDIT - cara yang disarankan untuk menggunakan struct
Saya perlu memperbarui jawaban saya. Sekarang - jika Anda membutuhkan file
struct
, Anda memiliki dua opsi bagus:a) Gunakan saja
attrs
Ini adalah perpustakaan untuk itu:
https://www.attrs.org/en/stable/
Apa yang Anda dapatkan ekstra: tidak menulis konstruktor, nilai default, validasi,,
__repr__
objek hanya-baca (untuk menggantinamedtuples
, bahkan dengan Python 2) dan banyak lagi.b) Gunakan
dataclasses
(Py 3.7+)Mengikuti komentar hwjp, saya juga merekomendasikan
dataclasses
:https://docs.python.org/3/library/dataclasses.html
Ini hampir sebagus
attrs
, dan merupakan mekanisme pustaka standar ("termasuk baterai"), tanpa ketergantungan tambahan, kecuali Python 3.7+.Sisa jawaban Sebelumnya
NamedTuple
tidak bagus - terutama sebelum python 3typing.NamedTuple
: https://docs.python.org/3/library/typing.html#typing.NamedTuple - Anda harus memeriksa pola "kelas yang diturunkan dariNamedTuple
". Python 2 -namedtuples
dibuat dari deskripsi string - jelek, buruk dan "pemrograman di dalam string literal" bodoh.Saya setuju dengan dua jawaban saat ini ("pertimbangkan untuk menggunakan sesuatu yang lain, tetapi pilint tidak selalu benar" - yang diterima, dan "gunakan komentar penekan pilek"), tetapi saya punya saran sendiri.
Izinkan saya menunjukkan ini sekali lagi: Beberapa kelas dimaksudkan hanya untuk menyimpan data.
Sekarang opsi untuk juga mempertimbangkan - gunakan
property
-ies.Di atas Anda memiliki properti hanya-baca, yang OK untuk Objek Nilai (misalnya seperti yang ada di Desain Didorong Domain), tetapi Anda juga dapat menyediakan penyetel - dengan cara ini kelas Anda akan dapat mengambil tanggung jawab atas bidang yang Anda miliki - misalnya untuk melakukan beberapa validasi, dll. (jika Anda memiliki penyetel, Anda dapat menetapkan menggunakannya dalam konstruktor, yaitu
self.foo = foo
alih-alih langsungself._foo = foo
, tapi hati-hati, penyetel mungkin menganggap bidang lain sudah diinisialisasi, dan kemudian Anda memerlukan validasi kustom dalam konstruktor) .sumber
attrs
pustaka, yang sebenarnya merupakan cetak biru untuk membuatdataclasses
modul.namedtuples
memiliki sintaks aneh untuk pewarisan ... mengharuskan setiap kelas menggunakan satu untuk mengetahui bahwa itu adalah tuple bernama dan__new__
bukan digunakan__init__
.dataclasses
tidak memiliki batasan iniSulit ketika atasan Anda mengharapkan prinsip tanggung jawab tunggal, tetapi pylint mengatakan tidak. Jadi tambahkan metode kedua ke kelas Anda sehingga kelas Anda melanggar prinsip tanggung jawab tunggal. Seberapa jauh Anda dimaksudkan untuk mengambil prinsip tanggung jawab tunggal ada di mata yang melihatnya.
Perbaikan saya,
Saya menambahkan metode tambahan ke kelas saya, jadi sekarang melakukan 2 hal.
Saya hanya ingin tahu apakah saya perlu membagi kelas saya menjadi 2 file terpisah sekarang, dan mungkin juga modul.
masalah terpecahkan, tetapi tidak dengan kolega saya yang menghabiskan sepanjang hari memperdebatkan spesifikasi, daripada melanjutkannya, seperti hidup dan mati.
sumber