Bagaimana cara membuat Pyflakes mengabaikan pernyataan?

138

Banyak modul kami dimulai dengan:

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

... dan itu satu-satunya peringatan Pyflakes di seluruh file:

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

Bagaimana saya bisa membuat Pyflakes mengabaikan ini?

(Biasanya saya akan membaca dokumen tetapi tautannya rusak. Jika tidak ada yang memiliki jawaban, saya hanya akan membaca sumbernya.)

seorang kutu buku yang dibayar
sumber
4
Saya ingin melihat patch untuk PyFlakes untuk ini!
Kimvais
2
Ini adalah bug pyflakes yang sudah berlangsung lama. Orang yang memperbaikinya akan mendapatkan bir yang ditandatangani secara pribadi oleh penulis pyflakes.
Phil Frost

Jawaban:

219

Jika Anda dapat menggunakan flake8 sebagai gantinya - yang membungkus pyflake serta pemeriksa pep8 - baris yang diakhiri dengan

# NOQA

(di mana spasinya signifikan - 2 spasi antara akhir kode dan #, satu di antara itu dan NOQAteks) akan memberi tahu pemeriksa untuk mengabaikan kesalahan apa pun pada baris itu.

yrstruly
sumber
Jika hanya ada cara untuk mendapatkan ini dari beberapa repo untuk EL6 :) - Saya rasa saya harus membungkusnya sendiri dengan rpm.
Kimvais
16
bagus, tapi bukan solusi untuk pyflakes
ezdazuzena
7
Tips: tambahkan baris ini # flake8: noqaakan memberi tahu flake8 untuk mengabaikan validasi untuk seluruh file.
Reorx
3
# noqahanya mengabaikan peringatan / kesalahan tertentu, tetapi tidak semua - untuk mengatasinya, solusinya melibatkan menginstal / menggunakan paket di pypi.python.org/pypi/flake8-respect-noqa
Tandai
8
Tip # noqa: F841berarti hanya mengabaikan F841kesalahan di telepon.
SangminKim
49

Saya tahu ini telah dipertanyakan beberapa waktu lalu dan sudah dijawab.

Tetapi saya ingin menambahkan apa yang biasanya saya gunakan:

try:
    import json
    assert json  # silence pyflakes
except ImportError:
    from django.utils import simplejson as json  # Python 2.4 fallback.
mfussenegger.dll
sumber
Ini sebenarnya yang akhirnya kami lakukan. (Nah, ini dan parsing output pyflakes untuk mengabaikan kesalahan pada baris dengan silence pyflakeskomentar.) Terima kasih!
kutu buku yang dibayar
Saya pikir assertpernyataan cukup untuk membungkam pemeriksa dalam kasus ini. Trik yang bagus, ngomong-ngomong.
Anton Strogonoff
Apakah ini didokumentasikan di mana saja?
Håken Lid
7

Ya, sayangnya dimod.org sedang down bersama dengan semua barang.

Melihat kode pyflakes, menurut saya pyflakes dirancang sedemikian rupa sehingga akan mudah digunakan sebagai "pemeriksa cepat tertanam".

Untuk mengimplementasikan fungsionalitas abaikan, Anda perlu menulis sendiri yang memanggil pemeriksa pyflakes.

Di sini Anda dapat menemukan ide: http://djangosnippets.org/snippets/1762/

Perhatikan bahwa potongan di atas hanya untuk tempat komentar pada baris yang sama. Untuk mengabaikan seluruh blok Anda mungkin ingin menambahkan 'pyflakes: ignore' di blok docstring dan filter berdasarkan node.doc.

Semoga berhasil!


Saya menggunakan pocket-lint untuk semua jenis analisis kode statis. Berikut adalah perubahan yang dibuat pada pocket-lint untuk mengabaikan pyflakes: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882

Adi Roiban
sumber
1
divmod.org sedang down, tetapi barangnya dapat ditemukan di launchpad ( code.launchpad.net/divmod.org ).
thebjorn
6

Mengutip dari tiket terbitan github :

Sementara perbaikan masih akan datang, beginilah cara mengatasinya, jika Anda bertanya-tanya:

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

Substitude _unittest dan _WritelnDecorator dengan entitas (modul, fungsi, kelas) yang Anda butuhkan

- deemoowoor

Daenyth
sumber
dan _WritelnDecorator;sama sekali tidak melakukan apa-apa, bukan? Jadi saya dapat menggunakan ini untuk membuat pyflakes mengabaikan variabel yang tidak digunakan yang sebenarnya digunakan di dalam string eval atau numexpr dengan mencantumkan variabel pada baris terpisah? Apakah tanda titik koma diperlukan?
endolith
1
Sebenarnya, menggunakan dis.dis, ini tampaknya melakukan LOAD_FASTdan POP_TOPuntuk setiap variabel pada baris dengan sendirinya (meletakkannya di tumpukan dan kemudian menghapusnya dari tumpukan?), Jadi tidak melakukan apa-apa. Lebih baik dari itu assert.
endolith
Titik koma tidak perlu. Pernyataan dapat diabaikan melalui tombol optimalkan sehingga tidak sepenuhnya tidak berguna.
Gringo Suave
6

Berikut adalah patch monyet untuk pyflakes yang menambahkan # bypass_pyflakesopsi komentar.

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

Jika Anda menyimpan ini sebagai bypass_pyflakes.py, maka Anda dapat memanggilnya sebagai python bypass_pyflakes.py myfile.py.

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

Chase Seibert
sumber
Saya tidak yakin apa yang berubah atau jika ada kesalahan dalam kode asli tetapi versi pyflakes saya (0.9.2) mengharuskan itu text_lineno = args[0] - 1diubah menjadi text_lineno = args[0].lineno - 1. Saya sarankan memperbarui jawaban ini untuk mencerminkan ini.
John Lunzer
1

Anda juga dapat mengimpor dengan __import__. Ini bukan pythonic, tapi pyflake tidak memperingatkan Anda lagi. Lihat dokumentasi untuk__import__ .

try:
    import json
except ImportError:
    __import__('django.utils', globals(), locals(), ['json'], -1)
mrijken
sumber
40
Saya mencari cara untuk membuat pyflakes mengabaikan kesalahan, bukan cara untuk membuat kode
jelek
Lebih lanjut, ini bukanlah solusi ketika melakukan sesuatu sepertifrom foo import bar
ezdazuzena
0

Saya membuat skrip shell kecil dengan beberapa awksihir untuk membantu saya. Dengan ini semua baris dengan import typing, from typing importatau #$(terakhir adalah komentar khusus yang saya gunakan di sini) dikecualikan ( $1adalah nama file dari skrip 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 ...

Pada dasarnya ini mencatat nomor baris dan secara dinamis membuat regex darinya.

phk
sumber