Gostaria muito de integrar o pylint ao processo de compilação dos meus projetos python, mas encontrei um show-stopper: um dos tipos de erro que considero extremamente E1101: *%s %r has no %r
member*
úteis-- : - relata constantemente erros ao usar campos django comuns , por exemplo:
E1101:125:get_user_tags: Class 'Tag' has no 'objects' member
que é causado 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 posso ajustar o Pylint para levar em consideração campos como objetos? (Eu também procurei na fonte do Django e não consegui encontrar a implementação de objects
, então suspeito que não seja "apenas" um campo de classe. Por outro lado, sou bastante novo em python, então pode muito bem ter esquecido alguma coisa.)
Edit: A única maneira que eu descobri para dizer ao pylint para não avisar sobre esses avisos é bloqueando todos os erros do tipo (E1101) que não são uma solução aceitável, já que esse é (na minha opinião) um erro extremamente útil. Se houver outra maneira, sem aumentar a fonte pylint, aponte-me para detalhes :)
Veja aqui um resumo dos problemas que tive pychecker
e pyflakes
- eles provaram ser muito instáveis para uso geral. (No caso do psicólogo, as falhas foram originadas no código do psicólogo - não na fonte que estava carregando / invocando.)
fonte
Respostas:
Não desative ou enfraqueça a funcionalidade Pylint adicionando
ignores
ougenerated-members
.Use um plugin Pylint desenvolvido ativamente que entenda o Django.
Este plugin Pylint para Django funciona muito bem:
e ao executar o pylint, adicione o seguinte sinalizador ao comando:
Postagem detalhada no blog aqui .
fonte
--load-plugins=pylint_django
à configuração linters / pylint / args. Observe o sinal '=', ele não funcionou sem ele.[MASTER] load-plugins=pylint_django
{"python.linting.pylintArgs": [ "--load-plugins=pylint_django" ],}
a resposta de tieuminh2510Eu uso o seguinte:
pylint --generated-members=objects
fonte
--generated-members=<members names>
Lista de membros que são configurados dinamicamente e perdidos pelo sistema de inferência pylint e, portanto, não devem acionar E0201 e E1101 quando acessados. [atual: REQUEST, acl_users, aq_parent]Meu ~ / .pylintrc contém
os dois últimos são especificamente para o Django.
Observe que há um bug no PyLint 0.21.1 que precisa de correções para fazer isso funcionar.
Edit: Depois de brincar um pouco mais com isso, decidi hackear o PyLint um pouquinho para permitir que eu expandisse o exposto acima para:
Eu simplesmente adicionei:
após a correção mencionada no relatório de erros (ou seja, na linha 129).
Dias felizes!
fonte
shlex
pacote e quebraram outra coisa agora. Eu tive que adicionargen.wordchars += "[]-+"
na linha 135 para obtê-lo para o trabalho ...pylint-django
, assim que o downvote é um pouco dura ...Se você usa o Código do Visual Studio, faça o seguinte:
pip install pylint-django
E adicione à configuração do VSC:
fonte
O django-lint é uma boa ferramenta que envolve o pylint com configurações específicas do django: http://chris-lamb.co.uk/projects/django-lint/
projeto github: https://github.com/lamby/django-lint
fonte
Por causa de como o pylint funciona (ele examina a fonte em si, sem permitir que o Python realmente o execute), é muito difícil para o pylint descobrir como metaclasses e classes básicas complexas realmente afetam uma classe e suas instâncias. A ferramenta 'pychecker' é um pouco melhor nesse sentido, porque faz realmente deixar Python executar o código; importa os módulos e examina os objetos resultantes. No entanto, essa abordagem tem outros problemas, porque na verdade permite que o Python execute o código :-)
Você pode estender o pylint para ensiná-lo sobre a mágica que o Django usa, ou para entender melhor as metaclasses ou classes básicas complexas, ou simplesmente ignorar esses casos depois de detectar um ou mais recursos que ele não entende. Eu não acho que seria particularmente fácil. Você também pode dizer ao pylint para não avisar sobre isso, através de comentários especiais na fonte, opções de linha de comando ou um arquivo .pylintrc.
fonte
Eu renunciei ao uso do pylint / pychecker em favor do uso de pyflakes com código Django - ele apenas tenta importar o módulo e relata qualquer problema encontrado, como importações não utilizadas ou nomes locais não inicializados.
fonte
Esta não é uma solução, mas você pode adicionar
objects = models.Manager()
aos seus modelos de Django sem alterar nenhum comportamento.Eu mesmo uso apenas flocos de neve, principalmente devido a alguns padrões estúpidos de pylint e preguiça da minha parte (não querendo saber como alterar os padrões).
fonte
objects
não deva ser adicionado magicamente de qualquer maneira.Tente executar o pylint com
Se isso funcionar, adicione todas as outras classes do Django - possivelmente usando um script, por exemplo, python: P
A documentação para
--ignore-classes
é:Devo acrescentar que essa não é uma solução elegante em particular, mas deve funcionar.
fonte
A solução proposta nesta outra questão é simplesmente adicionar get_attr à sua classe Tag. Feio, mas funciona.
fonte
Até agora, não encontrei uma solução real para isso, mas contornar:
fonte
Para
neovim & vim8
usar ow0rp's ale
plugin. Se você instalou tudo corretamentew0rp's ale
, incluindo ,pylint
&pylint-django
.vimrc
Adicione sua seguinte linha e divirta-se desenvolvendo aplicativos da Web usando o django. Obrigado.fonte