Come faccio a far ignorare a Pyflakes un'affermazione?


137

Molti dei nostri moduli iniziano con:

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

... ed è l'unico avviso Pyflakes nell'intero file:

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

Come posso convincere Pyflakes a ignorarlo?

(Normalmente andrei a leggere i documenti ma il link è interrotto. Se nessuno ha una risposta, leggerò solo la fonte.)


4
Vorrei vedere una patch per PyFlakes per questo!
Kimvais,


2
Questo è un bug pyflakes di vecchia data. La persona che lo aggiusterà riceverà una birra firmata personalmente dall'autore di pyflakes.
Phil Frost,

Risposte:


215

Se invece puoi usare flake8 - che avvolge pyflakes e il correttore pep8 - una linea che termina con

# NOQA

(in cui lo spazio è significativo - 2 spazi tra la fine del codice e il #, uno tra esso e il NOQAtesto) diranno al controllore di ignorare eventuali errori su quella riga.


Se ci fosse solo un modo per ottenerlo da un repository per EL6 :) - Immagino che dovrò farlo da solo in un numero di giri.
Kimvais,

13
bello, ma non una soluzione per i pyflakes
ezdazuzena,

7
Suggerimenti: aggiungere questa riga # flake8: noqaper dire a flake8 di ignorare la convalida dell'intero file.
Reorx,

3
# noqaignora solo alcuni avvisi / errori, ma non tutti: per ovviare a questo, una soluzione alternativa prevede l'installazione / l'utilizzo del pacchetto su pypi.python.org/pypi/flake8-respect-noqa
Mark

8
Suggerimenti # noqa: F841significa ignorare solo l' F841errore sulla linea.
SangminKim,

47

So che questo è stato messo in discussione qualche tempo fa e ha già ricevuto risposta.

Ma volevo aggiungere quello che di solito uso:

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

Questo è in realtà quello che abbiamo finito per fare. (Bene, questo e analizza l'output di pyflakes per ignorare gli errori sulle righe con un silence pyflakescommento.) Grazie!
un secchione pagato il

Penso che la assertdichiarazione sia sufficiente per mettere a tacere la pedina in questo caso. Bel trucco, comunque.
Anton Strogonoff,

Questo è documentato ovunque?
Håken Lid,

7

Sì, sfortunatamente dimod.org è in crisi insieme a tutti gli extra.

Guardando il codice di pyflakes, mi sembra che pyflakes sia progettato in modo che sia facile usarlo come "correttore veloce incorporato".

Per implementare la funzionalità ignora dovrai scrivere il tuo che chiama il controllo pyflakes.

Qui puoi trovare un'idea: http://djangosnippets.org/snippets/1762/

Tieni presente che lo snippet sopra riportato è solo per i commenti nella stessa riga. Per ignorare un intero blocco potresti voler aggiungere 'pyflakes: ignore' nel blocco di documenti e filtro basato su node.doc.

In bocca al lupo!


Sto usando Pocket-Lint per tutti i tipi di analisi del codice statico. Ecco le modifiche apportate in tasca per ignorare i pyflakes: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882


1
divmod.org non funziona, ma le chicche si possono trovare su launchpad ( code.launchpad.net/divmod.org ).
thebjorn,

6

Per citare dal biglietto di emissione github :

Mentre la correzione sta ancora arrivando, è così che può essere risolto, se ti stai chiedendo:

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

Sostituisci _unittest e _WritelnDecorator con le entità (moduli, funzioni, classi) necessarie

- deemoowoor


e _WritelnDecorator;non fa assolutamente nulla, giusto? Quindi posso usarlo per fare in modo che i pyflakes ignorino le variabili non utilizzate che vengono effettivamente utilizzate all'interno delle stringhe eval o numexpr elencando le variabili su una riga separata? Il punto e virgola è persino necessario?
endolito

1
In realtà, usando dis.disquesto, apparentemente fa un LOAD_FASTe POP_TOPper ogni variabile su una linea da sola (la mette in pila e poi la rimuove dalla pila?), Quindi non sta facendo nulla. Meglio di assert, però.
endolito

Punto e virgola non necessari. Le asserzioni possono essere ignorate tramite l'interruttore di ottimizzazione, quindi non del tutto inutili.
Gringo Suave,

6

Ecco una patch scimmia per pyflakes che aggiunge # bypass_pyflakesun'opzione di commento.

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 lo salvi come bypass_pyflakes.py, puoi invocarlo come python bypass_pyflakes.py myfile.py.

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


Non sono sicuro di cosa sia cambiato o se si sia verificato un errore nel codice originale, ma la mia versione di pyflakes (0.9.2) richiede che text_lineno = args[0] - 1sia cambiato text_lineno = args[0].lineno - 1. Raccomando di aggiornare questa risposta per riflettere questo.
John Lunzer,

1

Puoi anche importare con __import__. Non è pitonico, ma i pyflakes non ti avvertono più. Vedi documentazione per__import__ .

try:
    import json
except ImportError:
    __import__('django.utils', globals(), locals(), ['json'], -1)

40
Sto cercando un modo per fare in modo che i pyflakes ignorino gli errori, non un modo per rendere il mio codice
brutto

Inoltre, questa non è una soluzione quando si fa qualcosa di similefrom foo import bar
ezdazuzena,

0

Ho creato un piccolo script di shell con un po 'di awkmagia per aiutarmi. Con ciò vengono escluse tutte le righe con import typing, from typing importo #$(quest'ultima è un commento speciale che sto usando qui) ( $1è il nome del file dello 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 ...

Fondamentalmente prende nota dei numeri di riga e crea dinamicamente una regex.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.