it-swarm-eu.dev

Použití Pylint s Django

Velmi rád bych integroval pylint do procesu vytváření Mých pythonových projektů, ale narazil jsem na jednu show-stopper: Jeden z Typů chyb, které jsem našel velmi užitečné -: E1101: *%s %r has no %r member*-- neustále hlásí chyby při používání běžných polí Django, například:

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

způsobené tímto kódem:

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 mohu naladit Pylint, aby správně zohledňoval pole, jako jsou objekty? (Také jsem se podíval do zdroje Django a nemohl jsem najít implementaci objects, takže se domnívám, že to není "jen" pole třídy. Na druhé straně jsem docela nový na python, takže Možná jsem něco přehlédl.)

Edit: Jediný způsob, jak jsem zjistil, že nemám varování před těmito varováními, je blokování všech chyb typu (E1101), což není přijatelné řešení, protože to je (podle mého názoru) extrémně užitečná chyba. Pokud existuje jiný způsob, aniž by se rozšířil zdroj pylintu, prosím, ukažte mi na specifika :)

Viz zde pro shrnutí problémů, které jsem měl s pychecker a pyflakes - prokázali, že jsou pro všeobecné použití daleko nestabilní. (V případě pycheckerů vznikly pády v kódu pychecker - ne zdroj, který načítal/vyvolával.)

124
rcreswick

Funkci Pylint nezakazujte ani neoslabujte přidáním ignores nebo generated-members.
Použijte aktivně vyvinutý plugin Pylint, který chápe Django.
Tento plugin Pylint pro Django funguje celkem dobře:

pip install pylint-Django

a při spuštění pylintu přidejte k příkazu následující příznak:

--load-plugins pylint_Django

Podrobný blog post zde .

123
Tal Weiss

Používám následující: pylint --generated-members=objects

63
Ivan Perez

My ~/.pylintrc obsahuje

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

poslední dva jsou specificky pro Django.

Všimněte si, že existuje chyba v PyLint 0.21.1 , která potřebuje provést opravu.

Edit: Po rozhovoru s tímto trochu víc, jsem se rozhodl hack PyLint jen malý kousek, aby mi umožnil rozšířit výše na:

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

Jednoduše jsem přidal:

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

po opravě uvedené v hlášení o chybě (tj. na řádku 129).

Šťastné dny!

30
simon

Django-lint je pěkný nástroj, který zabalí pylint se specifickým nastavením Django: http://chris-lamb.co.uk/projects/Django-lint/

projekt github: https://github.com/lamby/Django-lint

19
gurney alex

Vzhledem k tomu, jak pylint funguje (zkoumá samotný zdroj, aniž by to umožnil Pythonu skutečně provést), je velmi těžké, aby pylint zjistil, jak metaklasy a složité basy skutečně ovlivňují třídu a její instance. Nástroj 'pychecker' je v tomto ohledu o něco lepší, protože does vlastně nechal Python spustit kód; importuje moduly a zkoumá výsledné objekty. Tento přístup však má jiné problémy, protože ve skutečnosti umožňuje Pythonu spustit kód :-)

Dalo by se rozšířit pylint naučit to o kouzlo Django používá, nebo aby to pochopit, metaclasses nebo složité baseclasses lépe, nebo prostě ignorovat takové případy po zjištění jednoho nebo více funkcí, které není zcela pochopit. Nemyslím si, že by to bylo obzvlášť snadné. Můžete také jen říci pylint, aby na tyto věci neoznámil, a to prostřednictvím speciálních komentářů ve zdroji, možnostech příkazového řádku nebo souboru .pylintrc.

16
Thomas Wouters

Pokud používáte kód Visual Studio, postupujte takto:

pip install pylint-Django

A přidejte do VSC config:

"python.linting.pylintArgs": [
    "--load-plugins=pylint_Django"
],
15
thiagofalcao

Rezignoval jsem na používání pylint/pychecker ve prospěch používání pyflakes s kódem Django - jen se pokouší importovat modul a hlásí jakýkoliv problém, který najde, jako například nepoužívané importy nebo neinicializované místní názvy.

7
zgoda

Toto není řešení, ale objects = models.Manager() můžete přidat do svých modelů Django bez změny chování.

Já sám používám pouze pyflakes, především kvůli nějakým hloupým výchozím hodnotám v pylint a lenost na mé straně (nechci se podívat, jak změnit výchozí nastavení).

7
AdamKG

Zkuste spustit pylint s

pylint --ignored-classes=Tags

Pokud to funguje, přidejte všechny ostatní třídy Django - možná pomocí skriptu, např. Python: P 

Dokumentace --ignore-classes je:

--ignored-classes=<members names>
Seznam názvů tříd, pro které by neměly být kontrolovány atributy Členů. [aktuální:% default]

Dodal bych, že toto není podle mého názoru zvláštní elegantní řešení, ale mělo by fungovat.

5
freespace

Řešení navržené v této jiné otázce to prostě přidat get_attr do vaší třídy tagu. Ošklivý, ale funguje.

3
eric

Dosud jsem nenašel žádné skutečné řešení, ale práce kolem:

  • V naší společnosti požadujeme pylint Skóre> 8. To umožňuje kódování Postupy pylint nerozumí A zároveň zajišťuje, že kód není také neobvyklý". Zatím jsme neviděli žádný případ, kdy by nás E1101 udržoval Od dosažení skóre 8 nebo [.].
  • Naše cíle „make check“ Odfiltrují „pro uživatele, kteří nemají žádné objekty“. .
1
max
  1. Přejít na nastavení ve VSC stisknutím Ctrl +,
  2. Stiskněte Ctrl + Shift + p, zadejte Python: Vyberte Linter
  3. Z rozevíracího seznamu vyberte položku mypy
  4. Pokud budete vyzváni, nainstalujte mypy.
0
Midhun Mohan

Pro neovim & vim8 použití w0rp's ale plugin. Pokud jste vše správně nainstalovali včetně w0rp's ale, pylint & pylint-Django. Ve vimrc přidejte následující řádek a bavte se vyvíjením webových aplikací pomocí Django. Díky.

let g:ale_python_pylint_options = '--load-plugins pylint_Django'
0
Ganesh