ฉันจะทำให้ Pyflakes เพิกเฉยต่อคำสั่งได้อย่างไร


138

โมดูลจำนวนมากของเราเริ่มต้นด้วย:

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

... และเป็นคำเตือน Pyflakes เดียวในไฟล์ทั้งหมด:

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

ฉันจะทำให้ Pyflakes เพิกเฉยต่อสิ่งนี้ได้อย่างไร

(ปกติฉันจะอ่านเอกสารแต่ลิงค์เสียถ้าไม่มีใครตอบฉันจะอ่านแหล่งที่มา)


4
ฉันต้องการดูแพทช์สำหรับ PyFlakes สำหรับสิ่งนี้!
Kimvais


2
นี่คือจุดบกพร่องของ pyflakes ที่มีมานาน ผู้ที่แก้ไขจะได้รับเบียร์ที่เซ็นชื่อโดยผู้เขียน pyflakes เป็นการส่วนตัว
Phil Frost

คำตอบ:


219

หากคุณสามารถใช้flake8แทน - ซึ่งห่อ pyflakes เช่นเดียวกับตัวตรวจสอบ pep8 - บรรทัดที่ลงท้ายด้วย

# NOQA

(ซึ่งช่องว่างมีนัยสำคัญ - ช่องว่าง 2 ช่องระหว่างจุดสิ้นสุดของโค้ดและช่องว่างระหว่างโค้ด#กับNOQAข้อความ) จะบอกให้ตัวตรวจสอบละเว้นข้อผิดพลาดใด ๆ ในบรรทัดนั้น


หากมีเพียงวิธีเดียวที่จะได้รับสิ่งนี้จาก repo สำหรับ EL6 :) - ฉันเดาว่าฉันจะต้องห่อสิ่งนี้ด้วยตัวเอง
Kimvais

16
ดี แต่ไม่ใช่วิธีแก้ปัญหาสำหรับ pyflakes
ezdazuzena

7
เคล็ดลับ: เพิ่มบรรทัดนี้# flake8: noqaจะบอกให้ flake8 ละเว้นการตรวจสอบความถูกต้องของไฟล์ทั้งหมด
Reorx

3
# noqaเพียงละเว้นคำเตือน / ข้อผิดพลาดบางอย่าง แต่ไม่ใช่ทั้งหมด - เพื่อจัดการกับปัญหานี้วิธีแก้ปัญหาเกี่ยวข้องกับการติดตั้ง / ใช้แพ็คเกจที่pypi.python.org/pypi/flake8-respect-noqa
ทำเครื่องหมาย

8
เคล็ดลับ# noqa: F841หมายถึงการละเว้นเฉพาะF841ข้อผิดพลาดที่บรรทัด
SangminKim

49

ฉันรู้ว่าเรื่องนี้ถูกตั้งคำถามมานานแล้วและมีคำตอบแล้ว

แต่ฉันต้องการเพิ่มสิ่งที่ฉันมักจะใช้:

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

นี่คือสิ่งที่เราทำ (นี่คือสิ่งนี้และการแยกวิเคราะห์เอาต์พุต pyflakes เพื่อละเว้นข้อผิดพลาดในบรรทัดพร้อมsilence pyflakesความคิดเห็น) ขอบคุณ!
คนโง่จ่าย

ฉันคิดว่าassertคำสั่งเพียงพอที่จะปิดปากผู้ตรวจสอบในกรณีนี้ เคล็ดลับที่ดีโดยวิธีการ
Anton Strogonoff

เอกสารนี้อยู่ที่ใด
Håken Lid

7

ใช่โชคไม่ดีที่ dimod.org ลงพร้อมกับสินค้าทั้งหมด

เมื่อมองไปที่รหัส pyflakes ฉันคิดว่า pyflakes ได้รับการออกแบบมาเพื่อให้ใช้เป็น "ตัวตรวจสอบแบบฝังตัวที่รวดเร็ว" ได้ง่าย

สำหรับการใช้ฟังก์ชันละเว้นคุณจะต้องเขียนของคุณเองที่เรียกว่าตัวตรวจสอบ pyflakes

คุณสามารถดูแนวคิดได้ที่นี่: http://djangosnippets.org/snippets/1762/

โปรดทราบว่าตัวอย่างข้อมูลด้านบนสำหรับแสดงความคิดเห็นในบรรทัดเดียวกันเท่านั้น สำหรับการละเว้นบล็อกทั้งหมดคุณอาจต้องการเพิ่ม 'pyflakes: ignored' ในบล็อก docstring และกรองตาม node.doc

โชคดี!


ฉันใช้ผ้าสำลีกระเป๋าสำหรับการวิเคราะห์รหัสคงที่ทุกประเภท การเปลี่ยนแปลงที่เกิดขึ้นใน pocket-lint สำหรับการละเว้น pyflakes: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882


1
divmod.org ไม่ทำงาน แต่สามารถพบได้ที่ launchpad ( code.launchpad.net/divmod.org )
thebjorn

6

วิธีอ้างจากgithub issue ticket :

ในขณะที่การแก้ไขยังคงมาถึงนี่คือวิธีที่สามารถแก้ไขได้หากคุณสงสัย:

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

Substitude _unittest และ _WritelnDecorator กับเอนทิตี (โมดูลฟังก์ชันคลาส) ที่คุณต้องการ

- deemoowoor


และ_WritelnDecorator;ไม่ได้ทำอะไรเลยใช่ไหม? ดังนั้นฉันสามารถใช้สิ่งนี้เพื่อรับ pyflakes เพื่อละเว้นตัวแปรที่ไม่ได้ใช้ซึ่งใช้จริงในสตริงevalหรือnumexprโดยการแสดงรายการตัวแปรในบรรทัดแยกกัน? อัฒภาคจำเป็นหรือไม่?
endolith

1
จริงๆแล้วการใช้dis.disสิ่งนี้เห็นได้ชัดว่า a LOAD_FASTและPOP_TOPสำหรับแต่ละตัวแปรในบรรทัดด้วยตัวเอง (วางไว้บนสแต็กแล้วลบออกจากสแต็ก?) ดังนั้นจึงไม่ได้ทำอะไรเลย ดีกว่าassertแม้ว่า
endolith

กึ่งลำไส้ไม่จำเป็น คุณสามารถละเว้นการยืนยันผ่านสวิตช์เพิ่มประสิทธิภาพดังนั้นจึงไม่ไร้ประโยชน์โดยสิ้นเชิง
Gringo Suave

6

นี่คือแพทช์ลิงสำหรับ pyflakes ที่เพิ่ม# bypass_pyflakesตัวเลือกความคิดเห็น

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

หากคุณบันทึกเป็นbypass_pyflakes.pyคุณสามารถเรียกใช้เป็นpython bypass_pyflakes.py myfile.pyไฟล์.

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


ฉันไม่แน่ใจว่ามีอะไรเปลี่ยนแปลงหรือมีข้อผิดพลาดในรหัสเดิม แต่ pyflakes เวอร์ชัน (0.9.2) ของฉันต้องการtext_lineno = args[0] - 1ให้เปลี่ยนเป็นtext_lineno = args[0].lineno - 1. ฉันขอแนะนำให้อัปเดตคำตอบนี้เพื่อแสดงถึงสิ่งนี้
John Lunzer

1

คุณยังสามารถนำเข้าด้วย__import__. ไม่ใช่ pythonic แต่ pyflakes ไม่เตือนคุณอีกต่อไป ดูเอกสาร__import__

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

40
ฉันกำลังมองหาวิธีที่จะทำให้ pyflakes ละเว้นข้อผิดพลาดที่ไม่ได้เป็นวิธีไปทำให้น่าเกลียดรหัสของฉัน :)
Kimvais

นอกจากนี้นี่ไม่ใช่วิธีแก้ปัญหาเมื่อทำสิ่งที่ชอบfrom foo import bar
ezdazuzena

0

ฉันสร้างเชลล์สคริปต์เล็ก ๆ น้อย ๆ ด้วยawkเวทมนตร์เพื่อช่วยฉัน ด้วยวิธีนี้ทุกบรรทัดด้วยimport typing, from typing importหรือ#$(หลังเป็นความคิดเห็นพิเศษฉันใช้ที่นี่) ได้รับการยกเว้น ( $1เป็นชื่อแฟ้มของสคริปต์ 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 ...

โดยทั่วไปจะบันทึกหมายเลขบรรทัดและสร้าง regex แบบไดนามิกออกมา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.