Bardzo chciałbym zintegrować pylint z procesem kompilacji moich projektów w Pythonie, ale natknąłem się na jeden show-stopper: jeden z typów błędów, który uważam za niezwykle przydatny -: - E1101: *%s %r has no %r
member*
stale zgłasza błędy podczas korzystania z typowych pól django , na przykład:
E1101:125:get_user_tags: Class 'Tag' has no 'objects' member
co jest spowodowane tym kodem:
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
Jak mogę tak dostroić Pylint, aby odpowiednio uwzględniał takie pola, jak obiekty? (Zajrzałem również do źródła Django i nie mogłem znaleźć implementacji objects
, więc podejrzewam, że nie jest to „tylko” pole klasy. Z drugiej strony, jestem całkiem nowy w Pythonie, więc mogli coś przeoczyć).
Edycja: Jedynym sposobem, w jaki udało mi się powiedzieć pylintowi, aby nie ostrzegał o tych ostrzeżeniach, jest blokowanie wszystkich błędów typu (E1101), co nie jest akceptowalnym rozwiązaniem, ponieważ jest to (moim zdaniem) niezwykle przydatny błąd. Jeśli jest inny sposób, bez rozszerzania źródła pylinta, proszę o wskazanie szczegółów :)
Zobacz tutaj podsumowanie problemów, z którymi miałem pychecker
i pyflakes
- okazały się one zbyt niestabilne do ogólnego użytku. (W przypadku pychecker, awarie pochodzą z kodu pychecker - a nie źródła, które ładował / wywoływał).
źródło
Odpowiedzi:
Nie wyłączaj ani nie osłabiaj funkcjonalności Pylint, dodając
ignores
lubgenerated-members
.Użyj aktywnie rozwijanej wtyczki Pylint, która rozumie Django.
Ta wtyczka Pylint dla Django działa całkiem dobrze:
i podczas uruchamiania pylint dodaj następującą flagę do polecenia:
Szczegółowy wpis na blogu tutaj .
źródło
--load-plugins=pylint_django
ustawienie linters / pylint / args. Zwróć uwagę na znak „=”, bez niego to nie zadziałało.[MASTER] load-plugins=pylint_django
{"python.linting.pylintArgs": [ "--load-plugins=pylint_django" ],}
wstawię wUżywam następujących:
pylint --generated-members=objects
źródło
--generated-members=<members names>
Lista elementów, które są ustawiane dynamicznie i pomijane przez system wnioskowania pylint, a więc nie powinny uruchamiać E0201 i E1101 podczas dostępu. [current: REQUEST, acl_users, aq_parent]Mój ~ / .pylintrc zawiera
ostatnie dwa są przeznaczone specjalnie dla Django.
Zauważ, że w PyLint 0.21.1 jest błąd, który wymaga łatania, aby to działało.
Edycja: Po tym, jak trochę się z tym pogubiłem, zdecydowałem się trochę zhakować PyLint, aby umożliwić mi rozwinięcie powyższego do:
Po prostu dodałem:
po poprawce wymienionej w zgłoszeniu błędu (tj. w linii 129).
Szczęśliwe dni!
źródło
shlex
pakietu i teraz zepsuli coś innego. Musiałem dodaćgen.wordchars += "[]-+"
w linii 135, żeby to zadziałało ...pylint-django
, więc głos negatywny jest nieco ostry ...Jeśli używasz Visual Studio Code, zrób to:
pip install pylint-django
I dodaj do konfiguracji VSC:
źródło
django-lint to fajne narzędzie, które otacza pylint z określonymi ustawieniami django: http://chris-lamb.co.uk/projects/django-lint/
projekt github: https://github.com/lamby/django-lint
źródło
Ze względu na to, jak działa pylint (bada samo źródło, nie pozwalając Pythonowi na jego wykonanie), bardzo trudno pylintowi dowiedzieć się, jak metaklasy i złożone klasy bazowe wpływają na klasę i jej instancje. The „pychecker” narzędzie jest nieco lepiej w tym względzie, ponieważ nie faktycznie niech Python wykonać kod; importuje moduły i sprawdza wynikowe obiekty. Jednak takie podejście ma inne problemy, ponieważ w rzeczywistości pozwala Pythonowi wykonać kod :-)
Możesz rozszerzyć pylint, aby nauczyć go o magii, której używa Django, lub aby lepiej rozumiał metaklasy lub złożone klasy podstawowe, lub po prostu zignorować takie przypadki po wykryciu jednej lub więcej funkcji, których nie do końca rozumie. Nie sądzę, żeby to było szczególnie łatwe. Możesz także po prostu powiedzieć pylintowi, aby nie ostrzegał o tych rzeczach, poprzez specjalne komentarze w źródle, opcje wiersza poleceń lub plik .pylintrc.
źródło
Zrezygnowałem z używania pylint / pychecker na rzecz używania pyflakes z kodem Django - po prostu próbuje zaimportować moduł i zgłasza wszelkie znalezione problemy, takie jak nieużywane importy lub niezainicjowane nazwy lokalne.
źródło
To nie jest rozwiązanie, ale możesz dodawać
objects = models.Manager()
do swoich modeli Django bez zmiany zachowania.Ja sam używam tylko pyflakes, głównie ze względu na głupie domyślne ustawienia pylinta i lenistwo z mojej strony (nie chcąc sprawdzać, jak zmienić ustawienia domyślne).
źródło
objects
tak nie powinno się ich magicznie dodawać.Spróbuj uruchomić pylint z
Jeśli to zadziała, dodaj wszystkie inne klasy Django - prawdopodobnie używając skryptu, na przykład python: P
Dokumentacja dla
--ignore-classes
:Dodam, że moim zdaniem nie jest to szczególnie eleganckie rozwiązanie, ale powinno działać.
źródło
Rozwiązanie zaproponowane w tym drugim pytaniu polega po prostu na dodaniu get_attr do Twojej klasy Tag. Brzydki, ale działa.
źródło
Jak dotąd nie znalazłem prawdziwego rozwiązania tego problemu, ale obejdź:
źródło
Do
neovim & vim8
użytkuw0rp's ale
plugin. Jeśli zainstalowałeś wszystko poprawnie w tymw0rp's ale
,pylint
zepylint-django
. W swojejvimrc
dodać następujący wiersz i baw tworzeniu aplikacji internetowych przy użyciu Django. Dzięki.źródło