Ich würde sehr gerne pylint in den Erstellungsprozess für meine Python-Projekte integrieren, aber ich bin auf einen Show-Stopper gestoßen: Einer der Fehlertypen, die ich äußerst nützlich finde:E1101: *%s %r has no %r
member*
- - meldet ständig Fehler, wenn allgemeine Django-Felder verwendet werden , zum Beispiel:
E1101:125:get_user_tags: Class 'Tag' has no 'objects' member
was durch diesen Code verursacht wird:
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
Wie kann ich Pylint so einstellen, dass Felder wie Objekte richtig berücksichtigt werden? (Ich habe mir auch die Django-Quelle angesehen und konnte die Implementierung von nicht finden objects
. Daher vermute ich, dass es sich nicht "nur" um ein Klassenfeld handelt. Andererseits bin ich ziemlich neu in Python, also ich kann sehr gut etwas übersehen haben.)
Bearbeiten: Die einzige Möglichkeit, Pylint anzuweisen, nicht vor diesen Warnungen zu warnen, besteht darin, alle Fehler des Typs (E1101) zu blockieren, was keine akzeptable Lösung darstellt, da dies (meiner Meinung nach) ein äußerst nützlicher Fehler ist. Wenn es einen anderen Weg gibt, ohne die Pylint-Quelle zu erweitern, weisen Sie mich bitte auf Einzelheiten hin :)
Sehen Sie hier eine Übersicht über die Probleme , die ich habe mit pychecker
und pyflakes
- sie weit zu instabil für den allgemeinen Gebrauch erwiesen haben. (Im Fall von Pychecker stammten die Abstürze aus dem Pychecker-Code - nicht aus der Quelle, die geladen / aufgerufen wurde.)
quelle
Antworten:
Deaktivieren oder schwächen Sie die Pylint-Funktionalität nicht durch Hinzufügen von
ignores
odergenerated-members
.Verwenden Sie ein aktiv entwickeltes Pylint-Plugin, das Django versteht .
Dieses Pylint-Plugin für Django funktioniert ganz gut:
und wenn Sie pylint ausführen, fügen Sie dem Befehl das folgende Flag hinzu:
Ausführlicher Blogbeitrag hier .
quelle
--load-plugins=pylint_django
Einstellung linters / pylint / args hinzufügen . Beachten Sie das Zeichen '=', ohne das es nicht funktioniert hat.[MASTER] load-plugins=pylint_django
{"python.linting.pylintArgs": [ "--load-plugins=pylint_django" ],}
eingebeIch benutze folgendes:
pylint --generated-members=objects
quelle
--generated-members=<members names>
Liste der Mitglieder, die dynamisch festgelegt werden und vom Pylint-Inferenzsystem übersehen werden und daher beim Zugriff nicht E0201 und E1101 auslösen sollten . [aktuell: REQUEST, acl_users, aq_parent]Mein ~ / .pylintrc enthält
Die letzten beiden sind speziell für Django.
Beachten Sie, dass in PyLint 0.21.1 ein Fehler vorliegt muss, damit dies funktioniert.
Bearbeiten: Nachdem ich ein bisschen mehr damit herumgespielt hatte, entschied ich mich, PyLint nur ein kleines bisschen zu hacken, damit ich das Obige erweitern kann in:
Ich habe einfach hinzugefügt:
nach dem im Fehlerbericht genannten Fix (dh in Zeile 129).
Glückliche Tage!
quelle
shlex
Paket zu verwenden, und jetzt etwas anderes kaputt gemacht. Ich musste ingen.wordchars += "[]-+"
Zeile 135 hinzufügen , damit es funktioniert ...pylint-django
, daher ist die Abwertung etwas hart ...Wenn Sie Visual Studio Code verwenden, gehen Sie wie folgt vor:
pip install pylint-django
Und zur VSC-Konfiguration hinzufügen:
quelle
django-lint ist ein nettes Tool, das Pylint mit django-spezifischen Einstellungen umschließt: http://chris-lamb.co.uk/projects/django-lint/
Github-Projekt: https://github.com/lamby/django-lint
quelle
Aufgrund der Funktionsweise von Pylint (es untersucht die Quelle selbst, ohne dass Python sie tatsächlich ausführt) ist es für Pylint sehr schwierig herauszufinden, wie sich Metaklassen und komplexe Basisklassen tatsächlich auf eine Klasse und ihre Instanzen auswirken. Das 'Pychecker'-Tool ist in dieser Hinsicht etwas besser, weil es es tut wirklich läßt Python den Code auszuführen; Es importiert die Module und untersucht die resultierenden Objekte. Dieser Ansatz hat jedoch andere Probleme, da Python den Code tatsächlich ausführen kann :-)
Sie können pylint erweitern, um es über die Magie zu unterrichten, die Django verwendet, oder um Metaklassen oder komplexe Grundklassen besser zu verstehen, oder um solche Fälle einfach zu ignorieren, nachdem Sie eine oder mehrere Funktionen entdeckt haben, die es nicht ganz versteht. Ich denke nicht, dass es besonders einfach wäre. Sie können pylint auch einfach durch spezielle Kommentare in der Quelle, Befehlszeilenoptionen oder eine .pylintrc-Datei anweisen, nicht vor diesen Dingen zu warnen.
quelle
Ich habe mich von der Verwendung von pylint / pychecker zurückgezogen, um Pyflakes mit Django-Code zu verwenden. Es wird lediglich versucht, ein Modul zu importieren, und es werden alle gefundenen Probleme gemeldet, z. B. nicht verwendete Importe oder nicht initialisierte lokale Namen.
quelle
Dies ist keine Lösung, aber Sie können
objects = models.Manager()
Ihre Django-Modelle erweitern, ohne das Verhalten zu ändern.Ich selbst verwende nur Pyflakes, hauptsächlich aufgrund einiger dummer Standardeinstellungen in Bezug auf Pylint und Faulheit meinerseits (ich möchte nicht nachschlagen, wie die Standardeinstellungen geändert werden können).
quelle
objects
sollte es sowieso nicht magisch hinzugefügt werden.Versuchen Sie, Pylint mit auszuführen
Wenn dies funktioniert, fügen Sie alle anderen Django-Klassen hinzu - möglicherweise mithilfe eines Skripts, z. B. Python: P.
Die Dokumentation für
--ignore-classes
ist:Ich sollte hinzufügen, dass dies aus meiner Sicht keine besonders elegante Lösung ist, aber es sollte funktionieren.
quelle
Die in dieser anderen Frage vorgeschlagene Lösung besteht darin , Ihrer Tag-Klasse einfach get_attr hinzuzufügen . Hässlich, funktioniert aber.
quelle
Bisher habe ich keine wirkliche Lösung dafür gefunden, sondern arbeite daran:
quelle
Zur
neovim & vim8
Verwendungw0rp's ale
Plugin. Wenn Sie alles richtig installiert haben , einschließlichw0rp's ale
,pylint
&pylint-django
.vimrc
Fügen Sie die folgende Zeile hinzu und haben Sie Spaß beim Entwickeln von Web-Apps mit Django. Vielen Dank.quelle