How do I get Pyflakes to ignore a statement?
Asked Answered
N

9

152

A lot of our modules start with:

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

...and it's the only Pyflakes warning in the entire file:

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

How can I get Pyflakes to ignore this?

(Normally I'd go read the docs but the link is broken. If nobody has an answer, I'll just read the source.)

Neophyte answered 17/2, 2011 at 19:40 Comment(3)
I would like to see a patch for PyFlakes for this!Indiscerptible
Ref: github.com/kevinw/pyflakes/issues/13Donyadoodad
This is a long-standing pyflakes bug. The person to fix it will get a beer personally signed by the pyflakes author.Donndonna
S
236

If you can use flake8 instead - which wraps pyflakes as well as the pep8 checker - a line ending with

# NOQA

(in which the space is significant - 2 spaces between the end of the code and the #, one between it and the NOQA text) will tell the checker to ignore any errors on that line.

Shikoku answered 8/5, 2012 at 21:22 Comment(11)
If there only was a way to get this from some repo for EL6 :) - I guess I'll have to wrap this in a rpm myself.Indiscerptible
@Kimvais, I'll probably be putting my ignorance on display here, but can you not get setuptools or distribute? Either of these will give you the easy_install command. Then you can get pip, with which you can install flake8. At least on Ubuntu, pip install is how I acquire Python packages not provided in the distribution.Shikoku
yes, I do use pip, but some people do not like software to be installed outside the package management system - luckily python setup.py bdist_rpm works on most packages.Indiscerptible
nice, but not a solution for pyflakesDepersonalization
Tips: add this line # flake8: noqa will tell flake8 to ignore validation for the whole file.Bendite
# noqa only ignores certain warnings/errors, but not all -- in order to deal with this, a workaround involves installing/using the package at pypi.python.org/pypi/flake8-respect-noqaLifer
This may seem irrelevant, but is there any expansion for noqa?Pulvinus
I have to come back to this post every few months because I end up thinking it is # NOQC.Fallen
Works in PyCharm.Parthena
Tips # noqa: F841 means ignoring only F841 error at the line.Q
Use flake8 --select=F to get flake8 to act like pyflakes.Sangraal
C
56

I know this was questioned some time ago and is already answered.

But I wanted to add what I usually use:

try:
    import json
    assert json  # silence pyflakes
except ImportError:
    from django.utils import simplejson as json  # Python 2.4 fallback.
Ceil answered 25/8, 2012 at 11:1 Comment(4)
This is actually what we ended up doing. (Well, this and parsing pyflakes output to ignore errors on lines with a silence pyflakes comment.) Thanks!Neophyte
I think assert statement is enough to silence the checker in this case. Nice trick, by the way.Kielty
Is this documented anywhere?Oriya
cannot find any documentation of it but this seems to a known trick, ref: groups.google.com/g/comp.lang.python/c/nryFbibthpo/m/…Airline
U
9

Yep, unfortunately dimod.org is down together with all goodies.

Looking at the pyflakes code, it seems to me that pyflakes is designed so that it will be easy to use it as an "embedded fast checker".

For implementing ignore functionality you will need to write your own that calls the pyflakes checker.

Here you can find an idea: http://djangosnippets.org/snippets/1762/

Note that the above snippet only for for comments places on the same line. For ignoring a whole block you might want to add 'pyflakes:ignore' in the block docstring and filter based on node.doc.

Good luck!


I am using pocket-lint for all kind of static code analysis. Here are the changes made in pocket-lint for ignoring pyflakes: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882

Undesigned answered 14/3, 2011 at 21:1 Comment(1)
divmod.org is down, but the goodies can be found at launchpad (code.launchpad.net/divmod.org).Aversion
D
7

To quote from the github issue ticket:

While the fix is still coming, this is how it can be worked around, if you're wondering:

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

Substitude _unittest and _WritelnDecorator with the entities (modules, functions, classes) you need

-- deemoowoor

Donyadoodad answered 8/5, 2012 at 19:55 Comment(3)
and _WritelnDecorator; does absolutely nothing, right? So I can use this to get pyflakes to ignore unused variables that are actually used inside eval or numexpr strings by listing the variables on a separate line? Is the semicolon even necessary?Differentia
Actually, using dis.dis, this apparently does a LOAD_FAST and POP_TOP for each variable on a line by itself (puts it on the stack and then removes it from the stack?), so it's not doing nothing. Better than assert, though.Differentia
Semi-colon not necessary. Asserts can be ignored thru the optimize switch so not totally useless.Forest
P
6

Here is a monkey patch for pyflakes that adds a # bypass_pyflakes comment option.

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

If you save this as bypass_pyflakes.py, then you can invoke it as python bypass_pyflakes.py myfile.py.

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

Pontificate answered 11/1, 2013 at 23:25 Comment(1)
I am not sure what changed or if there was an error in the original code but my version of pyflakes (0.9.2) requires that text_lineno = args[0] - 1 be changed to text_lineno = args[0].lineno - 1. I recommend updating this answer to reflect this.Subversive
O
5

Flake gives you some options to ignore violations.

My favorite one is to make it explicit and ignore the specific violation inline:

my invalid code # noqa: WS03

And you have the others already cited options.

  1. Ignore all validations in the line:
my invalid code # NOQA
  1. Ignore all validations in the file. Put in its first line:
# flake8: noqa: E121, E131, E241, F403, F405

Or configure to ignore it as a parameter in you flake8 configuration.

Oler answered 30/3, 2021 at 22:28 Comment(0)
B
1

You can also import with __import__. It's not pythonic, but pyflakes does not warn you anymore. See documentation for __import__ .

try:
    import json
except ImportError:
    __import__('django.utils', globals(), locals(), ['json'], -1)
Bush answered 8/5, 2012 at 13:38 Comment(2)
I'm looking a way to make pyflakes ignore the errors, not a way to uglify my code :)Indiscerptible
Furthermore, this is not a solution when doing something like from foo import barDepersonalization
T
0

I created a little shell script with some awk magic to help me. With this all lines with import typing, from typing import or #$ (latter is a special comment I am using here) are excluded ($1 is the file name of the Python script):

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

Basically it notes the line numbers and dynamically creates a regex out it.

Tenaculum answered 21/10, 2016 at 12:55 Comment(0)
S
0

For flake8, which is recommended alternative (compare flake8 vs pyflakes here)

Add the first line like:

# flake8: noqa: E121, E131, E241, F403, F405

in general:

# flake8: noqa: <code>[, <code> ...]

This way in one line you can silent the entire file and do it for many ignore statements at once, which is often a case.

Sparry answered 15/3, 2021 at 15:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.