Pyflakes'ın bir ifadeyi yoksaymasını nasıl sağlayabilirim?


137

Modüllerimizin çoğu şunlarla başlar:

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

... ve tüm dosyadaki tek Pyflakes uyarısı:

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

Pyflakes'ın bunu görmezden gelmesini nasıl sağlayabilirim?

(Normalde dokümanları okurdum ama bağlantı kopar. Kimsenin cevabı yoksa, sadece kaynağı okuyacağım.)


4
Bunun için PyFlakes için bir yama görmek istiyorum!
Kimvais


2
Bu uzun zamandır devam eden bir pyflakes böceğidir. Düzeltecek kişi, kişisel olarak pyflakes yazarı tarafından imzalanmış bir bira alacaktır.
Phil Frost

Yanıtlar:


215

Bunun yerine flake8'i kullanabiliyorsanız - py8'lerin yanı sıra pep8 kontrol cihazını da sararsa - ile biten bir çizgi

# NOQA

(boşluğun önemli olduğu - kodun sonu ile metin #ve NOQAmetin arasındaki bir boşluk ) denetleyiciye o satırdaki hataları yok saymasını söyler.


Sadece EL6 için bazı repo bu almak için bir yol olsaydı :) - Sanırım bu bir rpm kendim sarmak zorunda kalacak.
Kimvais

13
güzel, ama pyflakes için bir çözüm değil
ezdazuzena

7
İpuçları: Bu satırı ekleyin # flake8: noqaflake8'e tüm dosya için doğrulamayı yok saymasını söyleyecektir.
Reorx

3
# noqasadece belirli uyarıları / hataları göz ardı eder, ancak hepsini değil - bununla başa çıkmak için, bir geçici çözüm paketi pypi.python.org/pypi/flake8-respect-noqa
Mark

8
İpuçları # noqa: F841, yalnızca F841satırdaki hatayı yok saymak anlamına gelir .
SangminKim

47

Bunun bir süre önce sorgulandığını ve zaten cevaplandığını biliyorum.

Ama genellikle kullandığım şeyi eklemek istedim:

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

Aslında biz bunu yaptık. (Peki, bu ve ayrıştırma pyflakes çıkış silence pyflakesyorum satırlarında hataları yoksaymak için .) Teşekkürler!
ücretli bir inek

assertBu durumda denetleyicinin sesini kapatmak için ifade yeterli olduğunu düşünüyorum . Güzel numara, bu arada.
Anton Strogonoff

Bu herhangi bir yerde belgelenmiş mi?
Håken Lid

7

Evet, maalesef dimod.org tüm güzelliklerle birlikte düştü.

Pyflakes koduna bakıldığında, bana göre pyflakes bir "gömülü hızlı denetleyici" olarak kullanımı kolay olacak şekilde tasarlanmıştır.

Yoksayma işlevini uygulamak için, pyflakes denetleyicisini çağıran kendi yazmanız gerekir.

Burada bir fikir bulabilirsiniz: http://djangosnippets.org/snippets/1762/

Yukarıdaki snippet'in yalnızca aynı satırdaki yorumlar için olduğunu unutmayın. Bir bloğun tamamını yok saymak için, blok dokümana ve node.doc tabanlı filtreye 'pyflakes: ignore' eklemek isteyebilirsiniz.

İyi şanslar!


Her türlü statik kod analizi için pocket-lint kullanıyorum. Pyflakes yok saymak için cep lint yapılan değişiklikler şunlardır: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882


1
divmod.org kapalı, ancak hediyeler launchpad'de ( code.launchpad.net/divmod.org ) bulunabilir.
thebjorn

6

Github sayı biletinden alıntı yapmak için :

Düzeltme hala devam ederken, merak ediyorsanız, bu şekilde çözülebilir:

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

İhtiyacınız olan varlıklar (modüller, işlevler, sınıflar) ile _unittest ve _WritelnDecorator'ı değiştirin

- deemoowoor


ve _WritelnDecorator;kesinlikle hiçbir şey yapmıyor, değil mi? Yani ben aslında eval veya numexpr dizeleri kullanılan değişkenleri ayrı bir satırda listeleyerek kullanılan kullanılmayan değişkenleri yoksaymak için pyflakes almak için kullanabilirsiniz ? Noktalı virgül bile gerekli mi?
endolit

1
Aslında, dis.disbu, görünüşe göre, bir satırdaki her değişken için kendi başına bir LOAD_FASTve POP_TOPher değişkeni yapar (bunu yığına koyar ve sonra yığından kaldırır?), Bu yüzden hiçbir şey yapmaz. assertYine de daha iyi .
endolit

Yarı kolon gerekli değildir. Ekler optimize anahtarı aracılığıyla göz ardı edilebilir, bu yüzden tamamen işe yaramaz.
Gringo Suave

6

İşte # bypass_pyflakesyorum seçeneği ekleyen pyflakes için bir maymun yaması .

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

Bunu şu bypass_pyflakes.pyşekilde kaydederseniz, olarak çağırabilirsiniz python bypass_pyflakes.py myfile.py.

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


Neyin değiştiğinden veya orijinal kodda bir hata olup olmadığından emin değilim ama pyflakes (0.9.2) sürümümün text_lineno = args[0] - 1değiştirilmesi gerekiyor text_lineno = args[0].lineno - 1. Bunu yansıtmak için bu cevabı güncellemenizi tavsiye ederim.
John Lunzer

1

İle de içe aktarabilirsiniz __import__. Pitonik değil, ama pyflakes artık sizi uyarmıyor. İçin belgelere bakın__import__ .

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

40
Ben pyflakes hataları değil görmezden bir yol yapmak için bir yol arıyorum çirkinleştirmek kodumu :)
Kimvais

Ayrıca, böyle bir şey yaparken bu bir çözüm değildirfrom foo import bar
ezdazuzena

0

awkBana yardım etmek için biraz sihirle küçük bir kabuk senaryosu oluşturdum . Bununla tüm hatlar import typing, from typing importya da #$dışlanan ((ikincisinin burada kullanıyorum özel bir yorumdur) $1Python komut dosyası adıdır):

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 ...

Temel olarak satır numaralarını not eder ve dinamik olarak bir normal ifade oluşturur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.