Pylint'i Django ile Kullanma


140

Python'u python projelerim için oluşturma sürecine entegre etmek istiyorum, ancak bir show-stopper ile karşılaştım: Son derece yararlı bulduğum hata türlerinden biri -: - E1101: *%s %r has no %r member*yaygın django alanlarını kullanırken hata bildiriyor , Örneğin:

E1101:125:get_user_tags: Class 'Tag' has no 'objects' member

Bu kodun neden olduğu:

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

Pylint'i, nesneler gibi alanları gerektiği gibi dikkate alacak şekilde nasıl ayarlayabilirim? (Django kaynağına da baktım ve uygulanmasını bulamadım objects, bu yüzden "sadece" bir sınıf alanı olmadığından şüpheleniyorum. Öte yandan, python için oldukça yeniyim, bu yüzden ben çok iyi bir şey göz ardı etmiş olabilir.)

Düzenleme: Bu uyarılar hakkında uyarmamak için pylint söylemek için bulduğum tek yolu, (bence) son derece yararlı bir hata olduğu için kabul edilebilir bir çözüm değil türü (E1101) tüm hataları engellemektir. Başka bir yol varsa, pylint kaynağını artırmadan, lütfen beni detaylara yönlendirin :)

Karşılaştığım sorunların bir özeti için buraya bakın pycheckerve pyflakes- genel kullanım için dengesiz oldukları kanıtlanmıştır. (Pychecker durumunda, çökmeler pychecker kodundan kaynaklandı - yükleme / çağırma kaynağı değil.)


4
güncel bir cevap için @ talweiss'in gönderisine bakın!
Brendan


1
@Talweiss'in cevabını kabul edebilir misiniz? Bu en güncel ve doğru çözümdür.
Vijay Varadan

Yanıtlar:


155

Devre dışı etmeyin ya ekleyerek PyLint işlevselliği zayıflatmak ignoresveya generated-members. Django'yu anlayan
aktif olarak geliştirilmiş bir Pylint eklentisi kullanın . Django için bu Pylint eklentisi oldukça iyi çalışıyor:

pip install pylint-django

ve pylint'i çalıştırırken komuta aşağıdaki bayrağı ekleyin:

--load-plugins pylint_django

Ayrıntılı blog yazısı burada .


2
Blog gönderisinin bağlantısı öldü (çok yakında). İşte İnternet Arşivinden ve arşivden arşivlenmiş bazı bağlantılar. İs
Christian Long

3
Sublime Text'in SublimeLinter eklentisiyle çalışmasını sağlamak için linters --load-plugins=pylint_django/ pylint / args ayarına eklemek zorunda kaldım . '=' İşaretine dikkat edin, onsuz çalışmadı.
Dennis Golomazov

İşe yaramıyor. Bu hatayı alıyorum: E: 8, 0: 'django.db' modülünde isim yok 'modeller' (modül içinde isim yok)
maksimum 17

6
Bunu pylintrc'nize de ekleyebilirsiniz:[MASTER] load-plugins=pylint_django
azmeuk

3
Vs kodunda kullanıcı ayarlarında aşağıdakileri koymak kadar doz benim için çalışmıyor: {"python.linting.pylintArgs": [ "--load-plugins=pylint_django" ],} tieuminh2510's answer
ali-myousefi

63

Aşağıdakileri kullanıyorum: pylint --generated-members=objects


--generated-members=<members names>dinamik olarak ayarlanan ve pylint çıkarım sistemi tarafından kaçırılan ve bu nedenle erişildiğinde E0201 ve E1101'i tetiklememeleri gereken TYPECHECK üye listesi altındaki man pylint (1) . [current: REQUEST, acl_users, aq_parent]
Mark Mikofski

Bu PyDev / PyLint bölümünde tercihler altında tutulma PyDev ekleyin .
Mark Mikofski

2
Oluşturulan üyeler kullanıldığında bu hatalar sizden gizlenir, yine de yanlış nesnedeki nesneler alanına erişmeye çalışırken hatalar olabilir. Bunun yerine pylint-django eklentisini kullanın.
Vajk Hermecz

5
Bu, bazı işlevlerini devre dışı bırakarak Pylint'i düzeltmenin yanlış yoludur. Tek yapmanız gereken Django'yu anlayan bir Pylint eklentisi kurmak . Bkz. Stackoverflow.com/a/31000713/78234
Tal Weiss

31

~ / .Pylintrc içeriğim

[TYPECHECK]
generated-members=REQUEST,acl_users,aq_parent,objects,_meta,id

son ikisi özellikle Django için.

PyLint 0.21.1'de bu işi yapmak için yama gerektiren bir hata olduğunu unutmayın .

Düzenleme: Bu biraz daha uğraştıktan sonra, ben yukarı içine genişletmek için izin sadece biraz biraz PyLint kesmek karar verdi:

[TYPECHECK]
generated-members=REQUEST,acl_users,aq_parent,objects,_meta,id,[a-zA-Z]+_set

Basitçe ekledim:

    import re
    for pattern in self.config.generated_members:
        if re.match(pattern, node.attrname):
            return

hata raporunda belirtilen düzeltmeden sonra (yani 129. satırda).

Mutlu günler!


Yamanızı korumaya geri göndermeniz gerekir.
slacy

aslında bu yamayı 0.24'e eklediler, ancak shlexpaketi kullanmaya başladılar ve şimdi başka bir şey kırdılar. gen.wordchars += "[]-+"Çalışmak için 135 numaralı hattan eklemek zorunda kaldım ...
Simon

4
Oluşturulan üyeler kullanıldığında bu hatalar sizden gizlenir, yine de yanlış nesnede 'nesneler' alanına erişmeye çalışırken hatalar olabilir. Bunun yerine pylint-django eklentisini kullanın.
Vajk Hermecz

4
Bu, bazı işlevlerini devre dışı bırakarak Pylint'i düzeltmenin yanlış yoludur. Tek yapmanız gereken Django'yu anlayan bir Pylint eklentisi kurmak . Bkz. Stackoverflow.com/a/31000713/78234
Tal Weiss

3
@TalWeiss - adalet içinde, bu cevap üç yaşından büyük pylint-django, bu yüzden downvote biraz sert ...
simon

27

Visual Studio Code kullanıyorsanız bunu yapın:

pip install pylint-django

Ve VSC yapılandırmasına ekleyin:

"python.linting.pylintArgs": [
    "--load-plugins=pylint_django"
],

2
Şimdiye kadar en iyi yanıt: D
serfer2

19

django-lint, django'ya özgü ayarlarla pylint'i saran güzel bir araçtır: http://chris-lamb.co.uk/projects/django-lint/

github projesi: https://github.com/lamby/django-lint


1
Django'ya özgü bir pylint fikrini seviyorum, ama son denediğimde büyük bir adam gibi görünüyor.
Wernight

3
Ayrıca PyPI aracılığıyla mevcut değildir ve web sitesi aşağıdaki gibi yeterli bilgi vermiyor gibi görünüyor: Mevcut sürüm nedir?
Wernight

1
Konseptten hoşlanıyorum, ancak bu uygulama sadece yarı pişmiş ve herhangi bir orta büyüklükte kod tabanını kırıyor. Gerçekten yararlı olmadan önce uzun bir yol var.
Cerin

1
@ gurney alex, Link öldü.
shuttle87

2
Pylint-django artık daha aktif görünüyor, bu önerilen çözüm olmalı.
Vajk Hermecz

16

Pylint'in nasıl çalıştığından (Python'un gerçekten yürütmesine izin vermeden kaynağın kendisini inceler), pylint'in metasınıfların ve karmaşık temel sınıfların bir sınıfı ve örneklerini nasıl etkilediğini anlaması çok zordur. Çünkü 'pychecker' aracı, biraz daha iyi bu konuda olduğunu mu aslında Python kodu çalıştırmak izin; modülleri alır ve ortaya çıkan nesneleri inceler. Ancak, bu yaklaşımın başka sorunları vardır, çünkü aslında Python'un kodu çalıştırmasına izin verir :-)

Django'nun kullandığı sihirli şeyleri öğretmek ya da metasınıfları ya da karmaşık taban gözlüklerini daha iyi anlamasını sağlamak ya da tam olarak anlamadığı bir ya da daha fazla özelliği tespit ettikten sonra bu gibi durumları görmezden gelmek için pylint'i genişletebilirsiniz. Özellikle kolay olacağını sanmıyorum. Ayrıca pylint'e kaynak, komut satırı seçenekleri veya bir .pylintrc dosyasındaki özel yorumlar aracılığıyla bu şeyler hakkında uyarmamalarını söyleyebilirsiniz.


3
Pylint'i Django hakkında öğretmek kolay değil, ama yapıldı: Tek yapmanız gereken Django'yu anlayan bir Pylint eklentisi kurmak . Bkz. Stackoverflow.com/a/31000713/78234
Tal Weiss

Peki ben yükledim ama hala QuerySet hiçbir thins gibi thins hakkında compains ...
Eino Mäkitalo

7

Django kodu ile pyflakes kullanmak lehine pylint / pychecker kullanmaktan istifa ettim - sadece modülü içe aktarmaya çalışır ve kullanılmayan ithalatlar veya başlatılmamış yerel isimler gibi bulduğu herhangi bir sorunu bildirir.


ilginç - Pyflakes'e bir kez daha bakacağım.
rcreswick


1
Pylint'ten vazgeçmeye gerek yok - Tek yapmanız gereken Django'yu anlayan bir Pylint eklentisi kurmak . Bkz. Stackoverflow.com/a/31000713/78234
Tal Weiss

7

Bu bir çözüm değildir, ancak objects = models.Manager()herhangi bir davranışı değiştirmeden Django modellerinize ekleyebilirsiniz .

Ben kendim sadece öncelikle pylint ve tembellik bazı aptal varsayılan nedeniyle (varsayılanları değiştirmek için bakmak istemiyorum) pyflakes kullanın.


Ah ... bahşiş için teşekkürler. Bunu sadece django kaynağının yerel kopyasında Model.models'e eklemeyi deneyebilir ve bunun olup olmadığını görebilirim.
rcreswick

Bence bu harika bir çözüm çünkü uyarılardan ödün vermiyor.
Tom Leys

1
Bu kötü bir çözüm. Tamamlanmamış bir KG aracını düzeltmek için, kendinizi tekrar etmek ve mümkün olan bir şeyi değiştirmek daha sonra değişecektir (böylece bir KG sorunu ortaya çıkarır)?
Chris Morgan

2
Buna kötü bir çözüm demezdim: açık, örtük olmaktan iyidir. Belki objectsde sihirli bir şekilde eklenmemelidir.
Hardy

1
Bence bu Pylint'i düzeltmenin yanlış yolu - Django'yu bir anlamda yamalamak. Tek yapmanız gereken Django'yu anlayan bir Pylint eklentisi kurmak . Bkz. Stackoverflow.com/a/31000713/78234
Tal Weiss

5

İle pylint çalıştırmayı deneyin

pylint --ignored-classes=Tags

Bu işe yararsa, diğer tüm Django sınıflarını ekleyin - muhtemelen bir komut dosyası kullanarak, örneğin, python: P

İçin belgeler --ignore-classes:

--ignored-classes=<members names>
Üye özniteliklerinin denetlenmemesi gereken sınıf adlarının listesi (dinamik olarak ayarlanan özniteliklere sahip sınıflar için yararlıdır). [current:% varsayılan]

Bence bu özel bir zarif çözüm değil bence, ama işe yaramalı.


Sadece bu sınıflarda hiçbir hata yapmazsam çalışır;). Mümkünse kodu görmezden gelmekten kaçınmak istiyorum - Kod tabanının farklı bölümlerinin farklı derecelerde incelemeyi analiz etmesinin çok kötü bir fikir olduğunu düşünüyorum. Ben hangisi olduğunu unutacak ve hata ayıklama sırasında yanlış varsayımlar yapmak
rcreswick

1
Bu, bazı işlevlerini devre dışı bırakarak Pylint'i düzeltmenin yanlış yoludur. Tek yapmanız gereken Django'yu anlayan bir Pylint eklentisi kurmak . Bkz. Stackoverflow.com/a/31000713/78234
Tal Weiss

3

Bu diğer soruda önerilen çözüm , Tag sınıfınıza get_attr eklemektir . Çirkin, ama işe yarıyor.


1

Şimdiye kadar bunun için gerçek bir çözüm bulamadım ama geçici çözüm buluyorum

  • Şirketimizde bir pylint puanı> 8 istiyoruz. Bu, kodlamanın çok "olağandışı" olmamasını sağlarken pylint'in anlamadığı kodlama uygulamalarına izin verir. Şimdiye kadar E1101'in 8 veya daha yüksek bir puana ulaşmamızı engellediği bir örnek görmedik.
  • Django'yu anlamayan pylint'in neden olduğu dikkati dağıtan şeylerin çoğunu kaldıracak 'nesne kontrol' hedeflerimiz filtrelendi "mesajı yok.

0

İçin neovim & vim8kullanım w0rp's aleeklentisi. & Dahil olmak üzere her şeyi doğru şekilde yüklediyseniz w0rp's ale, pylint& pylint-django. Senin içinde vimrceklenti çizgisini takip ve eğlenceli Django kullanarak web uygulamaları geliştirme var. Teşekkürler.

let g:ale_python_pylint_options = '--load-plugins pylint_django'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.