Como faço para o Pyflakes ignorar uma declaração?

137

Muitos dos nossos módulos começam com:

try:
    import json
except ImportError:
    from django.utils import simplejson as json  # Python 2.4 fallback.

... e é o único aviso do Pyflakes no arquivo inteiro:

foo/bar.py:14: redefinition of unused 'json' from line 12

Como faço para que o Pyflakes ignore isso?

(Normalmente eu iria ler os documentos, mas o link está quebrado. Se ninguém tiver uma resposta, apenas lerei a fonte.)

um nerd pago
fonte
4
Eu gostaria de ver um patch para PyFlakes para isso!
Kimvais
Você
2
Este é um bug antigo de flocos de neve. A pessoa que consertar receberá uma cerveja assinada pessoalmente pelo autor dos flocos de neve.
Phil Geada

Respostas:

215

Se você pode usar o flake8 - que envolve os flocos de neve e o verificador pep8 - uma linha que termina com

# NOQA

(em que o espaço é significativo - 2 espaços entre o final do código e o #, um entre ele e o NOQAtexto) solicitarão ao verificador que ignore os erros nessa linha.

verdadeiramente
fonte
Se houvesse uma maneira de obter isso de algum repo para o EL6 :) - Acho que vou ter que enrolá-lo em uma rpm.
Kimvais
13
bom, mas não uma solução para pyflakes
ezdazuzena
7
Dicas: adicione esta linha # flake8: noqainstruirá o flake8 a ignorar a validação de todo o arquivo.
Reorx
3
# noqasó ignora certos avisos / erros, mas não todos -, a fim de lidar com isso, uma solução alternativa envolve a instalação / usando o pacote em pypi.python.org/pypi/flake8-respect-noqa
Mark
8
Dicas # noqa: F841significa ignorar apenas F841erros na linha.
SangminKim
47

Eu sei que isso foi questionado há algum tempo e já está respondido.

Mas eu queria adicionar o que costumo usar:

try:
    import json
    assert json  # silence pyflakes
except ImportError:
    from django.utils import simplejson as json  # Python 2.4 fallback.
mfussenegger
fonte
Isso é realmente o que acabamos fazendo. (Bem, isso e a análise de pyflakes produzem para ignorar erros nas linhas com um silence pyflakescomentário.) Obrigado!
um nerd pago
Penso que a assertafirmação é suficiente para silenciar o verificador neste caso. Bom truque, a propósito.
Anton Strogonoff 10/09
Isso está documentado em algum lugar?
Håken Lid
7

Sim, infelizmente o dimod.org está junto com todos os presentes.

Olhando para o código pyflakes, parece-me que o pyflakes foi projetado para facilitar o uso como um "verificador rápido incorporado".

Para implementar a funcionalidade de ignorar, você precisará escrever sua própria que chama o verificador pyflakes.

Aqui você pode encontrar uma idéia: http://djangosnippets.org/snippets/1762/

Observe que o snippet acima apenas para comentários é colocado na mesma linha. Para ignorar um bloco inteiro, convém adicionar 'pyflakes: ignore' no bloco de documentos e filtro com base no node.doc.

Boa sorte!


Estou usando o pocket-lint para todo tipo de análise de código estático. Aqui estão as alterações feitas no pocket-lint para ignorar os flocos de neve: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882

Adi Roiban
fonte
1
O divmod.org está fora do ar, mas os itens podem ser encontrados na barra de ativação ( code.launchpad.net/divmod.org ).
thebjorn
6

Para citar o ticket de emissão do github :

Enquanto a correção ainda está por vir, é assim que pode ser contornada, se você está se perguntando:

try:
    from unittest.runner import _WritelnDecorator
    _WritelnDecorator; # workaround for pyflakes issue #13
except ImportError:
    from unittest import _WritelnDecorator

Substitua _unittest e _WritelnDecorator pelas entidades (módulos, funções, classes) necessárias

- deemoowoor

Daenyth
fonte
e _WritelnDecorator;não faz absolutamente nada, certo? Para que eu possa usar isso para fazer com que os flocos de neve ignorem as variáveis ​​não utilizadas que são realmente usadas nas seqüências eval ou numexpr , listando as variáveis ​​em uma linha separada? O ponto e vírgula é necessário?
endolith 23/05
1
Na verdade, usando dis.dis, isso aparentemente faz um LOAD_FASTe POP_TOPpara cada variável em uma linha por si só (coloca na pilha e a remove da pilha?), Portanto, não está fazendo nada. Melhor que assert, no entanto.
endolith 23/05
Ponto e vírgula não é necessário. As declarações podem ser ignoradas através da opção de otimização, para não serem totalmente inúteis.
Gringo Suave
6

Aqui está um patch de macaco para flocos de neve que adiciona uma # bypass_pyflakesopção de comentário.

bypass_pyflakes.py

#!/usr/bin/env python

from pyflakes.scripts import pyflakes
from pyflakes.checker import Checker


def report_with_bypass(self, messageClass, *args, **kwargs):
    text_lineno = args[0] - 1
    with open(self.filename, 'r') as code:
        if code.readlines()[text_lineno].find('bypass_pyflakes') >= 0:
            return
    self.messages.append(messageClass(self.filename, *args, **kwargs))

# monkey patch checker to support bypass
Checker.report = report_with_bypass

pyflakes.main()

Se você salvar isso como bypass_pyflakes.py, poderá invocá-lo como python bypass_pyflakes.py myfile.py.

http://chase-seibert.github.com/blog/2013/01/11/bypass_pyflakes.html

Chase Seibert
fonte
Não sei ao certo o que mudou ou se houve um erro no código original, mas minha versão do pyflakes (0.9.2) exige que text_lineno = args[0] - 1seja alterado para text_lineno = args[0].lineno - 1. Eu recomendo atualizar esta resposta para refletir isso.
John Lunzer
1

Você também pode importar com __import__. Não é pitônico, mas os flocos de neve não o alertam mais. Veja a documentação para__import__ .

try:
    import json
except ImportError:
    __import__('django.utils', globals(), locals(), ['json'], -1)
Mrijken
fonte
40
Eu estou procurando uma maneira de fazer pyflakes ignorar os erros, não uma maneira de estragar a beleza meu código :)
Kimvais
Além disso, isso não é uma solução ao fazer algo comofrom foo import bar
ezdazuzena
0

Criei um pequeno script de shell com um pouco de awkmagia para me ajudar. Com isso, todas as linhas com import typing, from typing importou #$(este último é um comentário especial que estou usando aqui) são excluídas ( $1é o nome do arquivo do script Python):

result=$(pyflakes -- "$1" 2>&1)

# check whether there is any output
if [ "$result" ]; then

    # lines to exclude
    excl=$(awk 'BEGIN { ORS="" } /(#\$)|(import +typing)|(from +typing +import )/ { print sep NR; sep="|" }' "$1")

    # exclude lines if there are any (otherwise we get invalid regex)
    [ "$excl" ] &&
        result=$(awk "! /^[^:]+:(${excl}):/" <<< "$result")

fi

# now echo "$result" or such ...

Basicamente, ele anota os números das linhas e cria dinamicamente um regex.

phk
fonte