Como desabilito um aviso do Pylint?

267

Estou tentando desativar o aviso C0321 ("mais de uma instrução em uma única linha" - geralmente coloco ifinstruções com resultados curtos de uma linha na mesma linha), no Pylint 0.21.1 (se isso importa: somando 0,20. 1, comum 0.50.3, Python 2.6.6 (r266: 84292, 15 de setembro de 2010, 16:22:56).

Tentei adicionar disable=C0321o arquivo de configuração do Pylint, mas o Pylint insiste em denunciá-lo de qualquer maneira. Variações sobre essa linha (como disable=0321ou disable=C321) são sinalizadas como erros, então pylint faz reconhecer a opção adequada, é apenas ignorá-lo.

Isso é um bug do Pylint ou estou fazendo algo errado? Existe alguma maneira de contornar isso? Eu realmente gostaria de me livrar desse barulho.

Head Geek
fonte
1
Há uma boa solução aqui se você deseja desativar uma única linha de código, nem todos os erros do tipo.
Le Droid

Respostas:

168

pylint --generate-rcfile mostra assim:

[MESSAGES CONTROL]

# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple time.
#enable=

# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifier separated by comma (,) or put this option
# multiple time (only on the command line, not in the configuration file where
# it should appear only once).
#disable=

Portanto, parece que você ~/.pylintrcdeve ter as disable=linhas dentro de uma seção [MESSAGES CONTROL].

Chris Morgan
fonte
1
Obrigado, mas já o faz, na seção [MESSAGES CONTROL] como mostrado acima. Ainda ignorado.
Head Geek
6
@ Head Geek: bem, funciona para mim. ~/.pylintrccom duas linhas [MESSAGES CONTROL]e disable=C0321. Isso impede essa mensagem.
Chris Morgan
Estranho ... exatamente a mesma versão do PyLint?
Head Geek
@Head Geek: 0.21.3, 0.20.3 astng e 0.52.1 comum, na verdade, (o mais tardar quando eu instalei ele, mais recente que o seu)
Chris Morgan
1
Chris Morgan: Ah. Provavelmente um bug que já foi corrigido, então - estou usando a versão do repositório do Ubuntu. Obrigado!
Head Geek
165

Eu tive esse problema usando o Eclipse e resolvi-o da seguinte maneira:

na pasta pylint (por exemplo C:\Python26\Lib\site-packages\pylint), mantenha pressionada a tecla Shift, clique com o botão direito do mouse e escolha abrir o comando do Windows nessa pasta. Tipo:

lint.py --generate-rcfile > standard.rc

Isso cria o standard.rcarquivo de configuração. Abra-o no bloco de notas e em [MESSAGES CONTROL], remova o comentário disable=e adicione os IDs da mensagem que deseja desativar, por exemplo:

disable=W0511, C0321

Salve o arquivo e, em Eclipse-> janela-> preferências-> PyDev-> pylint, na caixa de argumentos, digite:

--rcfile=C:\Python26\Lib\site-packages\pylint\standard.rc

Agora deve funcionar ...


Você também pode adicionar um comentário na parte superior do seu código que será interpretado pelo pylint:

# pylint: disable=C0321

link para todos os códigos de mensagem pylint


Adicionar, por exemplo, --disable-ids=C0321na caixa de argumentos não funciona. Todas as mensagens pylint disponíveis são armazenadas no dicionário _messages, um atributo de uma instância da pylint.utils.MessagesHandlerMixInclasse. Ao executar o pylint com o argumento --disable-ids=...(pelo menos sem um arquivo de configuração), este dicionário está inicialmente vazio, gerando uma exceção KeyError no pylint ( pylint.utils.MessagesHandlerMixIn.check_message_id(). No Eclipse, você pode ver esta mensagem de erro no Pylint Console (windows - show view - Console , selecione console do Pylint nas opções do console, além do ícone do console.)

Remi
fonte
2
Não, realmente não deveria. 1) Faz referência ao Eclipse, que é irrelevante para a pergunta 2) Recomenda a desativação através dos códigos de mensagem herdados. Eu recomendaria minha resposta para a solução mais simples para o problema ou a resposta de Chris Johnson para mais detalhes.
imolit
153

A partir do Pylint v. 0.25.3, é possível usar os nomes simbólicos para desativar avisos em vez de ter que lembrar todos esses números de código . Por exemplo:

# pylint: disable=locally-disabled, multiple-statements, fixme, line-too-long

Esse estilo é mais instrutivo que os códigos de erro enigmático e também mais prático, pois as versões mais recentes do Pylint apenas emitem o nome simbólico, não o código de erro.

A correspondência entre nomes e códigos simbólicos pode ser encontrada aqui .

Um comentário de desativação pode ser inserido em sua própria linha, aplicando a desativação a tudo o que vem depois no mesmo bloco. Como alternativa, ele pode ser inserido no final da linha para a qual se destina a ser aplicado.

Se o pylint emitir " Locally disabling" mensagens, você pode se livrar delas incluindo a desativação locally-disabled primeiro, como no exemplo acima.

imolit
fonte
20
Mas colocar # pylint: disable=fooinlyne me faz ficar muito tempo, então agora preciso adicionar , line-too-long! Ironia; era disso que eu precisava e resolve meu problema. Obrigado!
dwanderson
Lista com as strings reais a serem usadas: gist.github.com/m451/965bb613177dd4fa896b815aa0e0e365
masi
81

Para desativar um aviso localmente em um bloco, adicione

# pylint: disable=C0321

para esse bloco.

thakis
fonte
5
Esta é uma técnica herdada e não é mais recomendada. Veja as outras respostas.
Acumenos
1
Você quer dizer que você deve usar o nome simbólico em vez do número do código, sim?
Thakis
5
Sim. A resposta imolit cobre exatamente isso.
Acumenus 14/10/16
2
Como se encontra o nome simbólico? Meu editor cuspirá [pylint] C0111: Missing method docstring; portanto, é fácil encontrar o número do código, mas encontrar o nome simbólico significa que tenho que procurar.
21818 Adam Parkin
@AdamParkin eu encontrei minhas mensagens aqui: pylint-messages.wikidot.com/all-messages
Jean-François T.
81

Existem várias maneiras de desativar avisos e erros do Pylint. Qual deles usar tem a ver com o quão global ou localmente você deseja aplicar a desativação - uma importante decisão de design.

Várias abordagens

  1. Em um ou mais pylintrcarquivos.

Isso envolve mais do que o ~/.pylintrcarquivo (no diretório $ HOME), conforme descrito por Chris Morgan. O Pylint procurará arquivos rc, com uma precedência que valorize os arquivos "mais próximos" mais altamente:

  • Um pylintrcarquivo no diretório de trabalho atual; ou

  • Se o diretório de trabalho atual estiver em um módulo Python (ou seja, ele contém um __init__.pyarquivo), procure na hierarquia dos módulos Python até que um pylintrcarquivo seja encontrado; ou

  • O arquivo nomeado pela variável de ambiente PYLINTRC; ou

  • Se você possui um diretório inicial que não é /root:

    • ~/.pylintrc; ou

    • ~/.config/pylintrc; ou

    • /etc/pylintrc

Observe que a maioria desses arquivos é nomeada pylintrc- apenas o arquivo ~possui um ponto inicial.

No seu pylintrcarquivo, adicione linhas para desativar mensagens específicas de pilões. Por exemplo:

[MESSAGES CONTROL]
disable=locally-disabled
  1. Desativa ainda mais a partir da pylintlinha de comando, conforme descrito por Aboo e Cairnarvon. Isso parece pylint --disable=bad-builtin. Repita --disablepara suprimir itens adicionais.

  2. Desativa ainda mais as linhas de código Python individuais, conforme descrito por Imolit. Eles se parecem com some statement # pylint: disable=broad-except(comentário extra no final da linha de origem original) e se aplicam apenas à linha atual . Minha abordagem é sempre colocá-las no final de outras linhas de código para que não sejam confundidas com o estilo do bloco, veja abaixo.

  3. Desativa ainda mais definido para blocos maiores de código Python, até completar os arquivos de origem.

    • Eles se parecem # pragma pylint: disable=bad-whitespace(observe a pragmapalavra-chave).

    • Isso se aplica a todas as linhas após o pragma. Colocar um bloco no topo de um arquivo faz com que as supressões se apliquem a todo o arquivo. Colocar o mesmo bloco mais baixo no arquivo os aplica apenas às linhas que seguem o bloco. Minha abordagem é sempre colocá-los em uma linha própria, para que não sejam confundidos com o estilo de linha única, veja acima.

    • Quando uma supressão deve ser aplicada apenas dentro de um intervalo de código, use # pragma pylint: enable=bad-whitespace(agora usando enablenão disable) para interromper a supressão.

Observe que a desativação de uma única linha usa a # pylintsintaxe, enquanto a desativação dessa linha em diante usa a # pragma pylintsintaxe. Estes são fáceis de confundir, especialmente ao copiar e colar.

Juntando tudo

Eu costumo usar uma mistura dessas abordagens.

  • Eu uso ~/.pylintrcpara padrões absolutamente globais - muito poucos deles.

  • Uso o nível do projeto pylintrcem diferentes níveis nos módulos Python quando existem padrões específicos do projeto. Especialmente quando você recebe o código de outra pessoa ou equipe, pode achar que eles usam convenções que você não prefere, mas não deseja refazer o código. Manter as configurações nesse nível ajuda a não espalhar essas práticas para outros projetos.

  • Eu uso os pragmas de estilo de bloco na parte superior dos arquivos de origem únicos. Gosto de desativar os pragmas (pare de suprimir as mensagens) no calor do desenvolvimento, mesmo para os padrões Pylint com os quais não concordo (como "muito poucos métodos públicos" - sempre recebo esse aviso nas classes Exception personalizadas) - mas é útil ver mais / talvez todas as mensagens Pylint enquanto você está desenvolvendo. Dessa forma, você pode encontrar os casos que deseja resolver com pragmas de linha única (veja abaixo) ou apenas adicionar comentários ao próximo desenvolvedor para explicar por que esse aviso está correto neste caso.

  • Deixo alguns pragmas em estilo de bloco ativados mesmo quando o código está pronto para o check-in. Tento usar alguns deles, mas quando faz sentido para o módulo, não há problema em fazer isso como documentação. No entanto, tento deixar o mínimo possível, de preferência nenhum.

  • Eu uso o estilo de comentário de linha única para solucionar erros especialmente potentes. Por exemplo, se há um lugar onde realmente faz sentido except Exception as exc, eu coloco a # pylint: disable=broad-exceptlinha nessa linha, em vez de uma abordagem mais global, porque essa é uma exceção estranha e precisa ser destacada, basicamente como uma forma de documentação.


Como tudo no Python, você pode agir em diferentes níveis de indireção. Meu conselho é pensar no que pertence a qual nível, para que você não tenha uma abordagem muito branda ao Pylint.

Chris Johnson
fonte
1
Melhor resposta, semelhante a stackoverflow.com/questions/16266452/…
Christophe Roussy
1
Na maioria das vezes, não posso advogar o uso de um não vazio global ~/.pylintrc. IMHO, a configuração normalmente deve estar vinculada ao projeto e, portanto, deve estar em algum lugar dentro do projeto. Somente então ele poderá ser controlado por versão e compartilhado com o projeto. Caso contrário, um clone pode não ter as personalizações necessárias para o pylint sair sem imprimir mensagens.
Acumenus 11/10
@ABB Eu acho que é sábio
Chris Johnson
3
@ ChrisJohnson O prefixo pragma parece totalmente desnecessário. Por exemplo, eu tenho # pylint: disable=missing-docstringna parte superior do meu arquivo, e isso se aplica a todo o restante do arquivo. Verifique e remova o pragmaprefixo da sua resposta.
Acumenus 31/10/16
O Pylint FAQ não escreve sobre nenhum pragma. ( pylint.pycqa.org/en/latest/… ): você pode desabilitar ou habilitar mensagens (desabilitadas globalmente) no nível do módulo, adicionando a opção correspondente em um comentário na parte superior do arquivo: # pylint: disable = curinga- importação, método oculto # pylint: enable = muitas linhas
Yaroslav Nikitenko
19

Você também pode usar o seguinte comando:

pylint --disable=C0321  test.py

Minha versão pylint é 0.25.1.

uma vaia
fonte
Agora é uma técnica legada. Recomenda-se o uso do nome simbólico do aviso de desativado. Veja esta resposta .
Acumenus 14/10/16
Isso não parece trabalhar com a --py3kbandeira quer :(
DylanYoung
Curiosamente, ele funciona bem se fornecido no rcarquivo e (mais preocupante) na verdade gera um rcarquivo correto com --generate-rcfile. Código precisar amor com várias ramificações que fazem a mesma coisa :(
DylanYoung
18

Esta é uma FAQ :

4.1 É possível desativar localmente uma mensagem específica?

Sim, esse recurso foi adicionado no Pylint 0.11. Isso pode ser feito adicionando
# pylint: disable=some-message,another-oneno nível de bloco desejado ou no final da linha de código desejada.

4.2 Existe uma maneira de desativar uma mensagem apenas para um módulo específico?

Sim, você pode desativar ou ativar mensagens (desativadas globalmente) no nível do módulo adicionando a opção correspondente em um comentário na parte superior do arquivo:

# pylint: disable=wildcard-import, method-hidden
# pylint: enable=too-many-lines

Você pode desativar as mensagens:

  • numérica ID: E1101, E1102etc.
  • mensagem simbólica: no-member, undefined-variableetc.
  • o nome de um grupo de verificações. Você pode pegar aqueles com pylint --list-groups.
  • categoria de cheques: C, R, W, etc.
  • todos os cheques com all.

Veja os documentos (ou execute pylint --list-msgsno terminal) para obter a lista completa de pylintmensagens. Os documentos também fornecem um bom exemplo de como usar esse recurso.

Eugene Yarmash
fonte
5

Você só precisa adicionar uma linha para desativar o que deseja desativar. Por exemplo

#pylint: disable = line-too-long, too-many-lines, no-name-in-module, import-error, multiple-imports, pointless-string-statement, wrong-import-order

Adicione isso no nº 1 do seu módulo

Chetan Malhotra
fonte
4

Caso isso ajude alguém, se você estiver usando o Visual Studio Code, espera que o arquivo esteja na codificação UTF8. Para gerar o arquivo, executei pylint --generate-rcfile | out-file -encoding utf8 .pylintrcno PowerShell.

Elijah W. Gagne
fonte
0

De acordo com a documentação do pylint , o mais fácil é usar este gráfico :

  • Verificações relacionadas à convenção C
  • R verificações relacionadas à refatoração
  • W vários avisos
  • Erros E, para prováveis ​​erros no código
  • F fatal, se ocorrer um erro que impeça o pylint de continuar o processamento.

Então, pode-se usar:

pylint -j 0 --disable=I,E,R,W,C,F YOUR_FILES_LOC
Arindam Roychowdhury
fonte
-1

A sintaxe do Python permite mais de uma instrução em uma linha, separada por ponto e vírgula (;). No entanto, limitar cada linha a uma instrução torna mais fácil para um ser humano seguir a lógica de um programa ao lê-la.

Portanto, outra maneira de resolver esse problema é entender por que a mensagem do fiapo existe e não colocar mais de uma declaração em uma linha.

Sim, você pode achar mais fácil escrever várias instruções por linha; no entanto, o pylint é para todos os outros leitores do seu código, não apenas para você.

hrf
fonte
-1

Você pode tentar o seguinte:

Edite "C: \ Usuários \ Seu Usuário \ AppData \ Roaming \ Código \ Usuário \ settings.json" e adicione python.linting.pylintArgslinhas no final, como mostrado abaixo:

{
    "team.showWelcomeMessage": false,
    "python.dataScience.sendSelectionToInteractiveWindow": true,
    "git.enableSmartCommit": true,
    "powershell.codeFormatting.useCorrectCasing": true,
    "files.autoSave": "onWindowChange",
    "python.linting.pylintArgs": [
        "--load-plugins=pylint_django",
        "--errors-only"
    ],
}
aarw76
fonte