Usando pylint com Django

votos
117

Eu gostaria muito de integrar pylint no processo de compilação de meus projetos Python, mas eu tenho que correr em um show-rolha: Um dos tipos de erro que eu acho extremamente useful--: E1101: *%s %r has no %r member*--constantly relata erros ao usar campos Django comuns , por exemplo:

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

que é causada por este código:

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

Como eu sintonia pylint pode tomar corretamente campos tais como objetos em conta? (Eu também olhei para a fonte de Django, e eu fui incapaz de encontrar a implementação de objects, então eu suspeito que não é apenas um campo de classe. Por outro lado, eu sou bastante novo para python, então eu pode muito bem ter esquecido alguma coisa.)

Edit: A única maneira que eu encontrei para dizer pylint para não alertar sobre esses avisos é através do bloqueio de todos os erros do tipo (E1101), que não é uma solução aceitável, uma vez que é (na minha opinião) um erro extremamente útil. Se não há outra maneira, sem aumentar a fonte pylint, por favor me aponte para especificidades :)

Veja aqui um resumo dos problemas que eu tive com pycheckere pyflakes- eles provado ser muito para a instável para uso geral. (No caso de pychecker, as falhas de origem no código pychecker - não fonte foi carregar / invocação.)

Publicado 22/09/2008 em 17:39
fonte usuário
Em outras línguas...                            


13 respostas

votos
101

Não desative ou enfraquecer funcionalidade pylint adicionando ignoresou generated-members.
Use um plugin pylint ativamente desenvolvido que compreende Django.
Este plugin pylint para Django funciona muito bem:

pip install pylint-django

e quando executar pylint adicione o seguinte sinalizador para o comando:

--load-plugins pylint_django

Post detalhado aqui .

Respondeu 23/06/2015 em 10:47
fonte usuário

votos
62

Eu uso o seguinte: pylint --generated-members=objects

Respondeu 12/09/2009 em 23:21
fonte usuário

votos
29

Meu ~ / .pylintrc contém

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

os dois últimos são especificamente para Django.

Note-se que há um bug no pylint 0.21.1 que precisa de remendar para fazer este trabalho.

Edit: Depois de brincar com isso um pouco mais, eu decidi cortar pylint apenas um pouquinho para me permitir expandir o acima em:

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

Eu simplesmente acrescentou:

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

após a correção mencionada no relatório de bug (ou seja, na linha 129).

Dias felizes!

Respondeu 12/11/2010 em 09:59
fonte usuário

votos
19

django-lint é uma boa ferramenta que envolve pylint com configurações específicas do Django: http://chris-lamb.co.uk/projects/django-lint/

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

Respondeu 16/03/2010 em 18:00
fonte usuário

votos
16

Por causa de como funciona (ele examina a própria fonte, sem deixar Python realmente executá-lo) é muito difícil para pylint descobrir como metaclasses e baseclasses complexos realmente afetar uma classe e suas instâncias pylint. A ferramenta 'pychecker' é um pouco melhor neste aspecto, porque ele não realmente deixar Python executar o código; ele importa os módulos e examina os objetos resultantes. No entanto, essa abordagem tem outros problemas, porque ele realmente deixe Python executar o código :-)

Você poderia estender pylint para ensiná-lo sobre a magia Django usa, ou para fazê-lo entender metaclasses ou baseclasses complexos melhor, ou para simplesmente ignorar tais casos depois de detectar um ou mais recursos que não entendo muito bem. Eu não acho que seria particularmente fácil. Você também pode simplesmente dizer pylint para não alertar sobre essas coisas, através de comentários especiais nas opções de fonte, linha de comando ou um arquivo .pylintrc.

Respondeu 22/09/2008 em 17:46
fonte usuário

votos
7

Esta não é uma solução, mas você pode adicionar objects = models.Manager()aos seus modelos Django sem alterar qualquer comportamento.

Eu mesmo só usar pyflakes, principalmente devido a alguns padrões mudos em pylint e preguiça da minha parte (não querendo olhar para cima como para alterar os padrões).

Respondeu 23/09/2008 em 01:17
fonte usuário

votos
6

Se você usar Visual Código Estúdio fazer isso:

pip install pylint-django

E adicionar a VSC config:

"python.linting.pylintArgs": [
    "--load-plugins=pylint_django"
],
Respondeu 12/12/2017 em 14:09
fonte usuário

votos
6

I demitiu-se usando pylint / pychecker em favor do uso pyflakes com código de Django - ele apenas tenta importar módulo e relatórios de qualquer problema que encontra, como as importações não utilizados ou nomes locais não inicializadas.

Respondeu 22/09/2008 em 21:12
fonte usuário

votos
5

Tente executar pylint com

pylint --ignored-classes=Tags

Se isso funcionar, adicione todas as outras classes de Django - possivelmente usando um script, em digamos, python: P

A documentação para --ignore-classesé:

--ignored-classes=<members names>
Lista de classes de nomes para as quais atributos de membro não devem ser verificados (útil para classes com atributos dynamicaly definido). [Atual:% padrão]

Devo acrescentar isso não é uma solução elegante especial na minha opinião, mas deve funcionar.

Respondeu 22/09/2008 em 17:50
fonte usuário

votos
2

A solução proposta neste outra questão que simplesmente adicionar get_attr a sua classe Tag. Feio, mas funciona.

Respondeu 24/02/2011 em 13:48
fonte usuário

votos
2

Até agora eu não encontrei nenhuma solução real para isso, mas resolver:

  • Na nossa empresa exigem uma pontuação pylint> 8. Isto permite práticas de codificação pylint não entende, assegurando que o código não é muito "incomum". Até agora, hav não visto qualquer instância onde E1101 nos impediu de alcançar um resultado de 8 ou superior.
  • Nosso 'make check' alvos filtrar "para não tem membros 'objetos'" mensagens para remover a maior parte da distração causada por pylint não entender Django.
Respondeu 04/01/2009 em 12:37
fonte usuário

votos
0
  1. Ir para configurações no VSC, pressionando Ctrl +,
  2. Pressione Ctrl + Shift + P, tipo Python: Selecione Linter
  3. Select mypy partir suspensa
  4. Instale mypy se solicitado.
Respondeu 29/03/2019 em 05:21
fonte usuário

votos
0

Para neovim & vim8uso w0rp's aleplugin. Se você instalou tudo corretamente, incluindo w0rp's ale, pylinte pylint-django. Em sua vimrcadicione a seguinte linha e se divertir desenvolvimento de aplicações web usando Django. Obrigado.

let g:ale_python_pylint_options = '--load-plugins pylint_django'
Respondeu 14/06/2018 em 12:40
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more