Làm cách nào để có được Pyflakes để bỏ qua một tuyên bố?


137

Rất nhiều mô-đun của chúng tôi bắt đầu với:

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

... và đó là cảnh báo Pyflakes duy nhất trong toàn bộ tệp:

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

Làm thế nào tôi có thể nhận được Pyflakes để bỏ qua điều này?

(Thông thường tôi sẽ đọc tài liệu nhưng liên kết bị hỏng. Nếu không ai có câu trả lời, tôi sẽ chỉ đọc nguồn.)


4
Tôi muốn xem một bản vá cho PyFlakes cho việc này!
Kimvais


2
Đây là một lỗi pyflakes lâu đời. Người sửa nó sẽ nhận được một bia cá nhân có chữ ký của tác giả pyflakes.
Phil Frost

Câu trả lời:


215

Nếu bạn có thể sử dụng flake8 thay thế - nó bao bọc các pyflakes cũng như trình kiểm tra pep8 - một dòng kết thúc bằng

# NOQA

(trong đó khoảng trắng là đáng kể - 2 khoảng trắng giữa phần cuối của mã và phần #giữa nó và NOQAvăn bản) sẽ báo cho người kiểm tra bỏ qua mọi lỗi trên dòng đó.


Nếu chỉ có một cách để có được điều này từ một số repo cho EL6 :) - Tôi đoán tôi sẽ phải tự bọc nó trong một vòng / phút.
Kimvais

13
tốt đẹp, nhưng không phải là một giải pháp cho pyflakes
ezdazuzena

7
Mẹo: thêm dòng # flake8: noqanày sẽ báo cho flake8 bỏ qua xác thực cho toàn bộ tệp.
Reorx

3
# noqachỉ bỏ qua các cảnh báo / lỗi nhất định, nhưng không phải tất cả - để giải quyết vấn đề này, một cách giải quyết liên quan đến việc cài đặt / sử dụng gói tại pypi.python.org/pypi/flower8-respect-noqa
Đánh dấu

8
Mẹo # noqa: F841có nghĩa là bỏ qua F841lỗi chỉ ở dòng.
SangminKim

47

Tôi biết điều này đã được hỏi một thời gian trước đây và đã được trả lời.

Nhưng tôi muốn thêm những gì tôi thường sử dụng:

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

Đây thực sự là những gì chúng tôi đã làm. (Chà, cái này phân tích cú pháp đầu ra của pyflakes để bỏ qua lỗi trên các dòng có silence pyflakesnhận xét.) Cảm ơn!
một mọt sách trả tiền

Tôi nghĩ rằng asserttuyên bố là đủ để im lặng người kiểm tra trong trường hợp này. Nhân tiện, mẹo hay.
Anton Strogonoff

Đây có phải là tài liệu ở bất cứ đâu?
Håken Nắp

7

Đúng, không may dimod.org không hoạt động cùng với tất cả các goodies.

Nhìn vào mã pyflakes, đối với tôi, dường như pyflakes được thiết kế sao cho dễ sử dụng như một "trình kiểm tra nhanh nhúng".

Để thực hiện chức năng bỏ qua, bạn sẽ cần phải viết riêng của bạn mà gọi trình kiểm tra pyflakes.

Tại đây bạn có thể tìm thấy một ý tưởng: http://djangosnippets.org/snippets/1762/

Lưu ý rằng đoạn mã trên chỉ dành cho các vị trí nhận xét trên cùng một dòng. Để bỏ qua toàn bộ một khối, bạn có thể muốn thêm 'pyflakes: ign' trong chuỗi khối và bộ lọc dựa trên node.doc.

Chúc may mắn!


Tôi đang sử dụng túi tiền cho tất cả các loại phân tích mã tĩnh. Dưới đây là những thay đổi được thực hiện trong túi tiền để bỏ qua các hình hoa hồng: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882


1
divmod.org không hoạt động, nhưng những điều tốt đẹp có thể được tìm thấy tại launchpad ( code.launchpad.net/divmod.org ).
thebjorn

6

Để trích dẫn từ vé phát hành github :

Mặc dù bản sửa lỗi vẫn đang đến, đây là cách nó có thể được khắc phục, nếu bạn đang tự hỏi:

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

Substitude _unittest và _WritelnDecorator với các thực thể (mô-đun, hàm, lớp) bạn cần

- deemoowoor


_WritelnDecorator;hoàn toàn không có gì, phải không? Vì vậy, tôi có thể sử dụng điều này để có được pyflakes để bỏ qua các biến không được sử dụng thực sự được sử dụng bên trong chuỗi eval hoặc numexpr bằng cách liệt kê các biến trên một dòng riêng biệt? Là dấu chấm phẩy thậm chí cần thiết?
endolith

1
Trên thực tế, bằng cách sử dụng dis.dis, điều này rõ ràng thực hiện một LOAD_FASTPOP_TOPcho từng biến trên một dòng (đặt nó trên ngăn xếp và sau đó loại bỏ nó khỏi ngăn xếp?), Vì vậy nó không làm gì cả. assertMặc dù tốt hơn
endolith

Bán đại tràng không cần thiết. Các xác nhận có thể được bỏ qua thông qua công tắc tối ưu hóa để không hoàn toàn vô dụng.
Gringo Suave

6

Dưới đây là một bản vá khỉ cho pyflakes có thêm # bypass_pyflakestùy chọn nhận xét.

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

Nếu bạn lưu nó dưới dạng bypass_pyflakes.py, thì bạn có thể gọi nó là python bypass_pyflakes.py myfile.py.

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


Tôi không chắc chắn điều gì đã thay đổi hoặc nếu có lỗi trong mã gốc nhưng phiên bản pyflakes của tôi (0.9.2) yêu cầu text_lineno = args[0] - 1phải thay đổi thành text_lineno = args[0].lineno - 1. Tôi khuyên bạn nên cập nhật câu trả lời này để phản ánh điều này.
John Lunzer

1

Bạn cũng có thể nhập với __import__. Nó không phải là pythonic, nhưng pyflakes không cảnh báo bạn nữa. Xem tài liệu cho__import__ .

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

40
Tôi đang tìm cách để làm cho pyflakes bỏ qua các lỗi, không phải là cách để làm xấu mã của tôi :)
Kimvais

Hơn nữa, đây không phải là một giải pháp khi làm một cái gì đó nhưfrom foo import bar
ezdazuzena

0

Tôi đã tạo ra một kịch bản shell nhỏ với một số awkphép thuật để giúp tôi. Với điều này, tất cả các dòng có import typing, from typing importhoặc #$(sau là một nhận xét đặc biệt tôi đang sử dụng ở đây) đều bị loại trừ ( $1là tên tệp của tập lệnh 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 ...

Về cơ bản, nó ghi chú các số dòng và tự động tạo ra một biểu thức chính.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.