flake8-tidy-imports
A flake8 plugin that helps you write tidier imports.
Installation
Install from pip with:
python -m pip install flake8-tidy-importsPython 3.5 to 3.9 supported.
When installed it will automatically be run as part of flake8; you can
check it is being picked up with:
$ flake8 --version
3.7.9 (flake8-tidy-imports: 3.1.0, mccabe: 0.6.1, pycodestyle: 2.5.0, pyflakes: 2.1.1) CPython 3.8.0 on DarwinLinting a Django project? Check out my book Speed Up Your Django Tests which covers loads of best practices so you can write faster, more accurate tests.
Options
banned-modules
Config for rule I251 (see below). A map where each line is a banned import
string, followed by '=', then the message to use when encountering that banned
import. Note that despite the name, you can ban imported objects too, since the
syntax is the same, such as decimal.Decimal.
There is also a special directive to ban a preselected list of removed/moved
modules between Python 2 and Python 3, recommending replacements, from six where possible. It can be turned on by adding
{python2to3} to the list of banned-modules.
Whilst the option can be passed on the commandline, it's much easier to
configure it in your config file, such as setup.cfg, for example:
[flake8]
banned-modules = mock = use unittest.mock!
urlparse = use six.moves.urllib.parse!
{python2to3}ban-relative-imports
Enables rule I252, which bans relative imports. See below.
[flake8]
ban-relative-imports = true(If you want to ban absolute imports, put your project's modules in banned-modules.)
Rules
N.B. Before version 4.0.0, the rule codes were numbered 50 less, e.g. I250
was I200. They were changed in Issue #106 due to
conflict with flake8-import-order.
I250: Unnecessary import alias
Complains about unnecessary import aliasing of three forms:
import foo as foo->import fooimport foo.bar as bar->from foo import barfrom foo import bar as bar->from foo import bar
The message includes the suggested rewrite (which may not be correct at current), for example:
$ flake8 file.py
file.py:1:1: I250 Unnecessary import alias - rewrite as 'from foo import bar'.I251: Banned import 'foo' used
Complains about importing of banned imports. This might be useful when
refactoring code, for example when moving from Python 2 to 3. By default there
are no imports banned - you should configure them with banned-modules as
described above in 'Options'.
The message includes a user-defined part that comes from the configuration. For example:
$ flake8 file.py
file.py:1:1: I251 Banned import 'mock' used - use unittest.mock instead.I252: Relative imports are banned.
Complains about use of relative imports:
from . import foofrom .bar import foo
Needs enabling with ban-relative-imports configuration option.
Absolute imports are recommended by PEP8:
Absolute imports are recommended, as they are usually more readable and tend to be better behaved...
See also
For more advanced control of imports in your project, try import-linter.

Formed in 2009, the Archive Team (not to be confused with the archive.org Archive-It Team) is a rogue archivist collective dedicated to saving copies of rapidly dying or deleted websites for the sake of history and digital heritage. The group is 100% composed of volunteers and interested parties, and has expanded into a large amount of related projects for saving online and digital history.
