Jak zmusić Pyflakes do zignorowania stwierdzenia?

137

Wiele naszych modułów zaczyna się od:

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

... i jest to jedyne ostrzeżenie Pyflakes w całym pliku:

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

Jak mogę zmusić Pyflakes do ignorowania tego?

(Normalnie chciałbym przeczytać dokumenty, ale link jest uszkodzony. Jeśli nikt nie ma odpowiedzi, po prostu przeczytam źródło).

płatny frajer
źródło
4
Chciałbym zobaczyć poprawkę do PyFlakes!
Kimvais
2
To od dawna występujący błąd pyflakes. Osoba, która to naprawi, otrzyma piwo podpisane osobiście przez autora pyflakes.
Phil Frost

Odpowiedzi:

215

Jeśli możesz zamiast tego użyć flake8 - który otacza pyflakes, a także kontroler pep8 - linia kończąca się na

# NOQA

(w których spacja jest znacząca - 2 spacje między końcem kodu a końcem kodu #, jedna między nim a NOQAtekstem) nakazuje sprawdzaniu ignorować wszelkie błędy w tym wierszu.

yrstruly
źródło
Gdyby tylko był sposób, aby to uzyskać z jakiegoś repozytorium dla EL6 :) - Myślę, że będę musiał sam to opakować w rpm.
Kimvais
13
ładne, ale nie rozwiązanie na pyflakes
ezdazuzena 31.07.14
7
Wskazówki: dodanie tej linii # flake8: noqaspowoduje, że flake8 zignoruje sprawdzanie poprawności całego pliku.
Reorx
3
# noqaignoruje tylko niektóre ostrzeżenia / błędy, ale nie wszystkie - aby sobie z tym poradzić, obejście polega na zainstalowaniu / użyciu pakietu na pypi.python.org/pypi/flake8-respect-noqa
Mark
8
Wskazówki # noqa: F841oznaczają ignorowanie tylko F841błędu na linii.
SangminKim,
47

Wiem, że to było kwestionowane jakiś czas temu i już na to odpowiedziano.

Ale chciałem dodać to, czego zwykle używam:

try:
    import json
    assert json  # silence pyflakes
except ImportError:
    from django.utils import simplejson as json  # Python 2.4 fallback.
mfussenegger
źródło
Tak właśnie skończyliśmy. (Cóż, to i parsowanie danych wyjściowych pyflakes w celu zignorowania błędów w wierszach z silence pyflakeskomentarzem.) Dzięki!
płatny nerd
Myślę, że assertstwierdzenie wystarczy, aby w tym przypadku uciszyć szachownicę. Nawiasem mówiąc, niezła sztuczka.
Anton Strogonoff
Czy jest to gdzieś udokumentowane?
Håken Lid
7

Tak, niestety dimod.org nie działa razem ze wszystkimi gadżetami.

Patrząc na kod pyflakes, wydaje mi się, że pyflakes zostało zaprojektowane tak, aby było łatwe w użyciu jako „osadzony szybki kontroler”.

Aby zaimplementować funkcję ignorowania, musisz napisać własną, która wywołuje funkcję sprawdzania pyflakes.

Tutaj możesz znaleźć pomysł: http://djangosnippets.org/snippets/1762/

Zauważ, że powyższy fragment tylko dla komentarzy umieszcza się w tej samej linii. Aby zignorować cały blok, możesz dodać „pyflakes: ignore” w dokumentacji bloku i filtr oparty na node.doc.

Powodzenia!


Używam pocket-lint do wszelkiego rodzaju statycznej analizy kodu. Oto zmiany wprowadzone w pocket-lint w celu zignorowania pyflakes: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882

Adi Roiban
źródło
1
divmod.org nie działa, ale gadżety można znaleźć na launchpad ( code.launchpad.net/divmod.org ).
thebjorn
6

Cytat z biletu na Github :

Chociaż poprawka wciąż nadchodzi, jeśli się zastanawiasz, w ten sposób można ją obejść:

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

Substitude _unittest i _WritelnDecorator z potrzebnymi jednostkami (modułami, funkcjami, klasami)

- deemoowoor

Daenyth
źródło
i _WritelnDecorator;nic nie robi, prawda? Więc mogę użyć tego, aby pyflakes ignorował nieużywane zmienne, które są faktycznie używane w ciągach eval lub numexpr , umieszczając zmienne w osobnym wierszu? Czy średnik jest w ogóle potrzebny?
endolith
1
Właściwie, używając dis.dis, to najwyraźniej robi LOAD_FASTa POP_TOPdla każdej zmiennej w wierszu samodzielnie (umieszcza ją na stosie, a następnie usuwa ze stosu?), Więc nic nie robi. assertAle lepiej niż .
endolit
Średnik nie jest konieczny. Potwierdzenia można ignorować za pomocą przełącznika optymalizacji, więc nie są całkowicie bezużyteczne.
Gringo Suave
6

Oto łatka małpa na pyflakes, która dodaje # bypass_pyflakesopcję komentarza.

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()

Jeśli zapiszesz to jako bypass_pyflakes.py, możesz wywołać go jako python bypass_pyflakes.py myfile.py.

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

Ścigaj Seiberta
źródło
Nie jestem pewien, co się zmieniło i czy w oryginalnym kodzie był błąd, ale moja wersja pyflakes (0.9.2) wymaga text_lineno = args[0] - 1zmiany na text_lineno = args[0].lineno - 1. Zalecam zaktualizowanie tej odpowiedzi, aby to odzwierciedlić.
John Lunzer,
1

Możesz także importować z __import__. To nie jest pytoniczne, ale pyflakes już Cię nie ostrzega. Zobacz dokumentację__import__ .

try:
    import json
except ImportError:
    __import__('django.utils', globals(), locals(), ['json'], -1)
mrijken
źródło
40
Szukam sposobu, aby pyflakes ignorowały błędy, a nie sposób na uszlachetnianie mojego kodu :)
Kimvais
Co więcej, nie jest to rozwiązanie, gdy robisz coś takiegofrom foo import bar
ezdazuzena
0

Stworzyłem mały skrypt powłoki z pewną awkmagią, aby mi pomóc. Z tym wszystkie linie z import typing, from typing importlub #$(ostatni jest specjalny komentarz używam tutaj) są wyłączone ( $1to nazwa pliku skryptu 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 ...

Zasadniczo zapisuje numery linii i dynamicznie tworzy z nich wyrażenie regularne.

phk
źródło