mirror of
https://github.com/PyCQA/flake8.git
synced 2026-03-30 10:46:54 +00:00
found via `pre-commit try-repo https://github.com/codespell-project/codespell --all-files`
306 lines
9.3 KiB
ReStructuredText
306 lines
9.3 KiB
ReStructuredText
===================================
|
|
Selecting and Ignoring Violations
|
|
===================================
|
|
|
|
It is possible to select and ignore certain violations reported by |Flake8|
|
|
and the plugins we've installed. It's also possible as of |Flake8| 3.0 to
|
|
combine usage of :option:`flake8 --select` and :option:`flake8 --ignore`. This
|
|
chapter of the User Guide aims to educate about how Flake8 will report errors
|
|
based on different inputs.
|
|
|
|
|
|
|
|
Ignoring Violations with Flake8
|
|
===============================
|
|
|
|
By default, |Flake8| has a list of error codes that it ignores. The list used
|
|
by a version of |Flake8| may be different than the list used by a different
|
|
version. To see the default list, :option:`flake8 --help` will
|
|
show the output with the current default list.
|
|
|
|
Extending the Default Ignore List
|
|
---------------------------------
|
|
|
|
If we want to extend the default list of ignored error codes, we can use
|
|
:option:`flake8 --extend-ignore` to specify a comma-separated list of codes
|
|
for a specific run on the command line, e.g.,
|
|
|
|
.. prompt:: bash
|
|
|
|
flake8 --extend-ignore=E1,E23 path/to/files/ path/to/more/files
|
|
|
|
This tells |Flake8| to ignore any error codes starting with ``E1`` and ``E23``,
|
|
in addition the default ignore list. To view the default error code ignore
|
|
list, run :option:`flake8 --help` and refer to the help text for
|
|
:option:`flake8 --ignore`.
|
|
|
|
|
|
..
|
|
The section below used to be titled `Changing the Default Ignore List`, but
|
|
was renamed for clarity.
|
|
Explicitly retain the old section anchor so as to not break links:
|
|
|
|
.. _changing-the-ignore-list:
|
|
|
|
Overriding the Default Ignore List
|
|
----------------------------------
|
|
|
|
If we want to *completely* override the default list of ignored error codes, we
|
|
can use :option:`flake8 --ignore` to specify a comma-separated list of codes
|
|
for a specific run on the command-line, e.g.,
|
|
|
|
.. prompt:: bash
|
|
|
|
flake8 --ignore=E1,E23,W503 path/to/files/ path/to/more/files/
|
|
|
|
This tells |Flake8| to *only* ignore error codes starting with ``E1``, ``E23``,
|
|
or ``W503`` while it is running.
|
|
|
|
.. note::
|
|
|
|
The documentation for :option:`flake8 --ignore` shows examples for how
|
|
to change the ignore list in the configuration file. See also
|
|
:ref:`configuration` as well for details about how to use configuration
|
|
files.
|
|
|
|
|
|
In-line Ignoring Errors
|
|
-----------------------
|
|
|
|
In some cases, we might not want to ignore an error code (or class of error
|
|
codes) for the entirety of our project. Instead, we might want to ignore the
|
|
specific error code on a specific line. Let's take for example a line like
|
|
|
|
.. code-block:: python
|
|
|
|
example = lambda: 'example'
|
|
|
|
Sometimes we genuinely need something this simple. We could instead define
|
|
a function like we normally would. Note, in some contexts this distracts from
|
|
what is actually happening. In those cases, we can also do:
|
|
|
|
.. code-block:: python
|
|
|
|
example = lambda: 'example' # noqa: E731
|
|
|
|
This will only ignore the error from pycodestyle that checks for lambda
|
|
assignments and generates an ``E731``. If there are other errors on the line
|
|
then those will be reported. ``# noqa`` is case-insensitive, without the colon
|
|
the part after ``# noqa`` would be ignored.
|
|
|
|
.. note::
|
|
|
|
If we ever want to disable |Flake8| respecting ``# noqa`` comments, we can
|
|
refer to :option:`flake8 --disable-noqa`.
|
|
|
|
If we instead had more than one error that we wished to ignore, we could
|
|
list all of the errors with commas separating them:
|
|
|
|
.. code-block:: python
|
|
|
|
# noqa: E731,E123
|
|
|
|
Finally, if we have a particularly bad line of code, we can ignore every error
|
|
using simply ``# noqa`` with nothing after it.
|
|
|
|
Contents before and after the ``# noqa: ...`` portion are ignored so multiple
|
|
comments may appear on one line. Here are several examples:
|
|
|
|
.. code-block:: python
|
|
|
|
# mypy requires `# type: ignore` to appear first
|
|
x = 5 # type: ignore # noqa: ABC123
|
|
|
|
# can use to add useful user information to a noqa comment
|
|
y = 6 # noqa: ABC456 # TODO: will fix this later
|
|
|
|
|
|
Ignoring Entire Files
|
|
---------------------
|
|
|
|
Imagine a situation where we are adding |Flake8| to a codebase. Let's further
|
|
imagine that with the exception of a few particularly bad files, we can add
|
|
|Flake8| easily and move on with our lives. There are two ways to ignore the
|
|
file:
|
|
|
|
#. By explicitly adding it to our list of excluded paths (see: :option:`flake8
|
|
--exclude`)
|
|
|
|
#. By adding ``# flake8: noqa`` to the file
|
|
|
|
The former is the **recommended** way of ignoring entire files. By using our
|
|
exclude list, we can include it in our configuration file and have one central
|
|
place to find what files aren't included in |Flake8| checks. The latter has the
|
|
benefit that when we run |Flake8| with :option:`flake8 --disable-noqa` all of
|
|
the errors in that file will show up without having to modify our
|
|
configuration. Both exist so we can choose which is better for us.
|
|
|
|
|
|
|
|
Selecting Violations with Flake8
|
|
================================
|
|
|
|
|Flake8| has a default list of violation classes that we use. This list is:
|
|
|
|
- ``C90``
|
|
|
|
All ``C90`` class violations are reported when the user specifies
|
|
:option:`flake8 --max-complexity`
|
|
|
|
- ``E``
|
|
|
|
All ``E`` class violations are "errors" reported by pycodestyle
|
|
|
|
- ``F``
|
|
|
|
All ``F`` class violations are reported by pyflakes
|
|
|
|
- ``W``
|
|
|
|
All ``W`` class violations are "warnings" reported by pycodestyle
|
|
|
|
This list can be overridden by specifying :option:`flake8 --select`. Just as
|
|
specifying :option:`flake8 --ignore` will change the behaviour of |Flake8|, so
|
|
will :option:`flake8 --select`.
|
|
|
|
Let's look through some examples using this sample code:
|
|
|
|
.. code-block:: python
|
|
|
|
# example.py
|
|
def foo():
|
|
print(
|
|
"Hello"
|
|
"World"
|
|
)
|
|
|
|
By default, if we run ``flake8`` on this file we'll get:
|
|
|
|
.. prompt:: bash
|
|
|
|
flake8 example.py
|
|
|
|
.. code:: text
|
|
|
|
example.py:4:9: E131 continuation line unaligned for hanging indent
|
|
|
|
Now let's select all ``E`` class violations:
|
|
|
|
.. prompt:: bash
|
|
|
|
flake8 --select E example.py
|
|
|
|
.. code:: text
|
|
|
|
example.py:3:17: E126 continuation line over-indented for hanging indent
|
|
example.py:4:9: E131 continuation line unaligned for hanging indent
|
|
example.py:5:9: E121 continuation line under-indented for hanging indent
|
|
|
|
Suddenly we now have far more errors that are reported to us. Using
|
|
``--select`` alone will override the default ``--ignore`` list. In these cases,
|
|
the user is telling us that they want all ``E`` violations and so we ignore
|
|
our list of violations that we ignore by default.
|
|
|
|
We can also be highly specific. For example, we can do
|
|
|
|
.. prompt:: bash
|
|
|
|
flake8 --select E121 example.py
|
|
|
|
.. code:: text
|
|
|
|
example.py:5:9: E121 continuation line under-indented for hanging indent
|
|
|
|
We can also specify lists of items to select both on the command-line and in
|
|
our configuration files.
|
|
|
|
.. prompt:: bash
|
|
|
|
flake8 --select E121,E131 example.py
|
|
|
|
.. code:: text
|
|
|
|
example.py:4:9: E131 continuation line unaligned for hanging indent
|
|
example.py:5:9: E121 continuation line under-indented for hanging indent
|
|
|
|
|
|
|
|
Selecting and Ignoring Simultaneously For Fun and Profit
|
|
========================================================
|
|
|
|
Prior to |Flake8| 3.0, all handling of :option:`flake8 --select` and
|
|
:option:`flake8 --ignore` was delegated to pycodestyle. Its handling of the
|
|
options significantly differs from how |Flake8| 3.0 has been designed.
|
|
|
|
pycodestyle has always preferred ``--ignore`` over ``--select`` and will
|
|
ignore ``--select`` if the user provides both. |Flake8| 3.0 will now do its
|
|
best to intuitively combine both options provided by the user. Let's look at
|
|
some examples using:
|
|
|
|
.. code-block:: python
|
|
|
|
# example.py
|
|
import os
|
|
|
|
|
|
def foo():
|
|
var = 1
|
|
print(
|
|
"Hello"
|
|
"World"
|
|
)
|
|
|
|
If we run |Flake8| with its default settings we get:
|
|
|
|
.. prompt:: bash
|
|
|
|
flake8 example.py
|
|
|
|
.. code:: text
|
|
|
|
example.py:1:1: F401 'os' imported but unused
|
|
example.py:5:5: F841 local variable 'var' is assigned to but never used
|
|
example.py:8:9: E131 continuation line unaligned for hanging indent
|
|
|
|
Now let's select all ``E`` and ``F`` violations including those in the default
|
|
ignore list.
|
|
|
|
.. prompt:: bash
|
|
|
|
flake8 --select E,F example.py
|
|
|
|
.. code:: text
|
|
|
|
example.py:1:1: F401 'os' imported but unused
|
|
example.py:5:5: F841 local variable 'var' is assigned to but never used
|
|
example.py:7:17: E126 continuation line over-indented for hanging indent
|
|
example.py:8:9: E131 continuation line unaligned for hanging indent
|
|
example.py:9:9: E121 continuation line under-indented for hanging indent
|
|
|
|
Now let's selectively ignore some of these while selecting the rest:
|
|
|
|
.. prompt:: bash
|
|
|
|
flake8 --select E,F --ignore F401,E121 example.py
|
|
|
|
.. code:: text
|
|
|
|
example.py:5:5: F841 local variable 'var' is assigned to but never used
|
|
example.py:7:17: E126 continuation line over-indented for hanging indent
|
|
example.py:8:9: E131 continuation line unaligned for hanging indent
|
|
|
|
Via this example, we can see that the *most specific* **user-specified** rule
|
|
will win. So in the above, we had very vague select rules and two very
|
|
specific ignore rules. Let's look at a different example:
|
|
|
|
.. prompt:: bash
|
|
|
|
flake8 --select F401,E131 --ignore E,F example.py
|
|
|
|
.. code:: text
|
|
|
|
example.py:1:1: F401 'os' imported but unused
|
|
example.py:8:9: E131 continuation line unaligned for hanging indent
|
|
|
|
In this case, we see that since our selected violation codes were more
|
|
specific those were reported.
|