Saya sangat ingin mengintegrasikan pylint ke dalam proses pembangunan untuk proyek python saya, tetapi saya telah mengalami satu show-stopper: Salah satu jenis kesalahan yang saya temukan sangat berguna--: - E1101: *%s %r has no %r
member*
Terus-menerus melaporkan kesalahan saat menggunakan bidang Django umum , sebagai contoh:
E1101:125:get_user_tags: Class 'Tag' has no 'objects' member
yang disebabkan oleh kode ini:
def get_user_tags(username):
"""
Gets all the tags that username has used.
Returns a query set.
"""
return Tag.objects.filter( ## This line triggers the error.
tagownership__users__username__exact=username).distinct()
# Here is the Tag class, models.Model is provided by Django:
class Tag(models.Model):
"""
Model for user-defined strings that help categorize Events on
on a per-user basis.
"""
name = models.CharField(max_length=500, null=False, unique=True)
def __unicode__(self):
return self.name
Bagaimana saya bisa menyetel Pylint agar mengambil bidang seperti objek dengan benar? (Saya juga telah melihat ke sumber Django, dan saya tidak dapat menemukan implementasi objects
, jadi saya menduga itu bukan "hanya" bidang kelas. Di sisi lain, saya cukup baru untuk python, jadi saya mungkin telah mengabaikan sesuatu.)
Edit: Satu-satunya cara yang saya temukan untuk memberitahu pylint untuk tidak memperingatkan tentang peringatan ini adalah dengan memblokir semua kesalahan jenis (E1101) yang bukan merupakan solusi yang dapat diterima, karena itu (menurut saya) merupakan kesalahan yang sangat berguna. Jika ada cara lain, tanpa menambah sumber pylint, harap tunjukkan saya secara spesifik :)
Lihat di sini untuk ringkasan masalah yang saya alami pychecker
dan pyflakes
- mereka terbukti jauh dari tidak stabil untuk penggunaan umum. (Dalam kasus pychecker, crash berasal dari kode pychecker - bukan sumber yang dimuat / dipanggil.)
sumber
Jawaban:
Jangan menonaktifkan atau melemahkan fungsionalitas Pylint dengan menambahkan
ignores
ataugenerated-members
.Gunakan plugin Pylint yang dikembangkan secara aktif yang memahami Django.
Plugin Pylint untuk Django ini bekerja dengan sangat baik:
dan saat menjalankan pylint tambahkan flag berikut ke perintah:
Posting blog terinci di sini .
sumber
--load-plugins=pylint_django
pengaturan linters / pylint / args. Perhatikan tanda '=', itu tidak berfungsi tanpanya.[MASTER] load-plugins=pylint_django
{"python.linting.pylintArgs": [ "--load-plugins=pylint_django" ],}
jawaban tieuminh2510Saya menggunakan yang berikut ini:
pylint --generated-members=objects
sumber
--generated-members=<members names>
Daftar anggota yang ditetapkan secara dinamis dan tidak terjawab oleh sistem inferensi pylint, dan karenanya tidak boleh memicu E0201 dan E1101 ketika diakses. [sekarang: REQUEST, acl_users, aq_parent]My ~ / .pylintrc mengandung
dua yang terakhir khusus untuk Django.
Perhatikan bahwa ada bug di PyLint 0.21.1 yang perlu ditambal untuk membuatnya berfungsi.
Sunting: Setelah mengacaukan ini sedikit lagi, saya memutuskan untuk meretas PyLint sedikit saja agar saya dapat memperluas hal di atas menjadi:
Saya hanya menambahkan:
setelah perbaikan disebutkan dalam laporan bug (yaitu, pada baris 129).
Hari hari menyenangkan!
sumber
shlex
paket, dan merusak sesuatu yang lain sekarang. Saya harus menambahkangen.wordchars += "[]-+"
pada baris 135 untuk membuatnya berfungsi ...pylint-django
, jadi downvote agak keras ...Jika Anda menggunakan Visual Studio Code lakukan ini:
pip install pylint-django
Dan tambahkan ke konfigurasi VSC:
sumber
django-lint adalah alat yang bagus yang membungkus pylint dengan pengaturan spesifik Django: http://chris-lamb.co.uk/projects/django-lint/
proyek github: https://github.com/lamby/django-lint
sumber
Karena cara kerja pylint (memeriksa sumbernya sendiri, tanpa membiarkan Python benar-benar mengeksekusinya), sangat sulit bagi pylint untuk mengetahui bagaimana metaclasses dan baseclasses kompleks benar-benar memengaruhi kelas dan instansnya. Alat 'pychecker' sedikit lebih baik dalam hal ini, karena memang demikian benar benar membiarkan Python mengeksekusi kode; itu mengimpor modul dan memeriksa objek yang dihasilkan. Namun, pendekatan itu memiliki masalah lain, karena itu benar-benar membiarkan Python mengeksekusi kode :-)
Anda bisa memperluas pylint untuk mengajarkannya tentang sihir yang digunakan Django, atau membuatnya lebih memahami metaclasses atau baseclasses kompleks, atau mengabaikan kasus-kasus seperti itu setelah mendeteksi satu atau lebih fitur yang tidak terlalu dipahami. Saya tidak berpikir itu akan sangat mudah. Anda juga bisa memberi tahu pylint untuk tidak memperingatkan tentang hal-hal ini, melalui komentar khusus pada sumber, opsi baris perintah atau file .pylintrc.
sumber
Saya mengundurkan diri dari menggunakan pylint / pychecker untuk menggunakan pyflakes dengan kode Django - itu hanya mencoba mengimpor modul dan melaporkan setiap masalah yang ditemukannya, seperti impor yang tidak digunakan atau nama lokal yang tidak diinisialisasi.
sumber
Ini bukan solusi, tetapi Anda dapat menambah
objects = models.Manager()
model Django Anda tanpa mengubah perilaku apa pun.Saya sendiri hanya menggunakan pyflakes, terutama karena beberapa default bodoh di pylint dan kemalasan pada bagian saya (tidak ingin mencari cara mengubah default).
sumber
objects
seharusnya tidak ditambahkan secara ajaib.Coba jalankan pylint dengan
Jika berhasil, tambahkan semua kelas Django lainnya - mungkin menggunakan skrip, misalnya, python: P
Dokumentasi untuk
--ignore-classes
adalah:Saya harus menambahkan ini bukan solusi elegan khusus dalam pandangan saya, tetapi harus berhasil.
sumber
Solusi yang diajukan dalam pertanyaan lain ini adalah menambahkan get_attr ke kelas Tag Anda. Jelek, tapi berhasil.
sumber
Sejauh ini saya belum menemukan solusi nyata untuk itu tetapi bekerja di sekitar:
sumber
Untuk
neovim & vim8
menggunakanw0rp's ale
plugin. Jika Anda telah menginstal semuanya dengan benar termasukw0rp's ale
,pylint
&pylint-django
. Divimrc
baris Anda tambahkan & bersenang-senang mengembangkan aplikasi web menggunakan Django. Terima kasih.sumber