Alphabetize is a Flake8 plugin for checking the
order of import statements, the __all__ list and except lists. It is
designed to work well with the
Black formatting tool, in that
Black never alters the
Abstract Syntax Tree (AST),
while Alphabetize is only interested in the AST, and so the two tools never conflict.
In the spirit of Black, Alphabetize is an 'uncompromising import style checker' in that
the style can't be configured, there's just one style (see below for the rules).
Alphabetise is released under the MIT-0 licence. It is tested on Python 3.7+.
Table of Contents
- Create a virtual environment:
python3 -m venv venv - Activate it:
source venv/bin/activate
- Install:
pip install flake8-alphabetize
Say we have a Python file myfile.py:
from datetime import time, date
print(time(9, 39), date(2021, 4, 11))by running the command flake8 we'll get:
myfile.py:1:1: AZ200 Imported names are in the wrong order. Should be date, time
We can tell Alphabetize what the package name is, and then it'll know that its imports should be in a group at the bottom of the imports. Here's an example:
import uuid
from myapp import myfunc
print(uuid.UUID4(), myfunc())by running the command flake8 --application-names myapp we won't get any errors.
As you use Flake8 in the normal way, Alphabetize will report errors using the following codes:
| Code | Error Type |
|---|---|
| AZ100 | Import statements are in the wrong order |
| AZ200 | The names in the import from are in the wrong order |
| AZ300 | Two import from statements must be combined. |
| AZ400 | The names in the __all__ are in the wrong order |
| AZ500 | The names in the exception handler list are in the wrong order |
Alphabetize follows the Black formatter's uncompromising approach and so there's only
one configuration option which is application-names. This is a comma-separated list
of top-level, package names that are to be treated as application imports, eg. 'myapp'.
Since Alphabetize is a Flake8 plugin, this configuration option is set using
Flake8 configuration.
Alphabetize can be easily configured to run in your existing pre-commit hooks, as an additional dependency of Flake8:
repos:
- repo: https://github.com/pycqa/flake8
rev: 6.0.0
hooks:
- id: flake8
additional_dependencies: ['flake8-alphabetize']Here are the ordering rules that Alphabetize follows:
- The special case
from __future__import comes first. - Imports from the standard library come next, followed by third party imports, followed by application imports.
- Relative imports are assumed to be application imports.
- The standard library group has
importstatements first (in alphabetical order), followed byfrom importstatements (in alphabetical order). - The third party group is further grouped by library name. Then each library subgroup
has
importstatements first (in alphabetical order), followed byfrom importstatements (in alphabetical order). - The application group is further grouped by import level, with absolute imports first
and then relative imports of increasing level. Within each level, the imports should
be ordered by library name. Then each library subgroup has
importstatements first (in alphabetical order), followed byfrom importstatements (in alphabetical order). from importstatements for the same library must be combined.- Alphabetize only looks at imports at the module level, any imports within the code are ignored.
Run tox to run the tests.
- Install tox:
pip install tox - Run tox:
tox
It might be worth running the OpenSSF Scorecard:
sudo docker run -e GITHUB_AUTH_TOKEN=<auth_token> gcr.io/openssf/scorecard:stable \ --repo=github.com/tlocke/flake8-alphabetize
Run tox to make sure all tests pass, then update the release notes, then do:
git tag -a x.y.z -m "version x.y.z" rm -r dist python -m build twine upload dist/*
- Fixed a bug where it crashes on qualified names in an exception list.
- Check the ordering of
excepthandler lists.
- Make Alphabetize compatible with Flake8 6.0.0
- Fix bug where sub-packages (eg.
collections.abc) aren't recognised as being part of the standard library for versions of Python >= 3.10.
- Handle the case of an
__all__being atuple.
- Don't perform any import order checks if there are multiple imports on a line, as this will be reported by Flake8. Once the Flake8 error has been fixed, checks can continue.
- Fix bug where the
--application-namescommand line option failed with a comma-separated list.
- Fix bug where
from . import loggingappears in message asfrom .None import logging.
- Fix bug where it fails on a relative import such as
from . import logging.
- Check the order of the elements of
__all__.
- Order application imports by import level, absolute imports at the top.
- Fix bug where potentially fails with > 2 imports.
- There's a clash of option names, so now application imports can now be identified by
setting the
application-namesconfiguration option.
- Application imports can now be identified by setting the
application-package-namesconfiguration option.
- Import of
__future__. Should always be first.
- Third party libraries should be grouped by top-level name.
- Take into account whether a module is in the standard library or not.
- Make entry point AZ instead of ALP.
- Check the order within
from importstatements.
- Partially support
from importstatements.
- Now partially supports
importstatements.
- Initial release. Doesn't do much at this stage.