Import order coding standard
PEP8 suggests that:
Imports should be grouped in the following order:
- standard library imports
- related third party imports
- local application/library specific imports
You should put a blank line between each group of imports.
Is there a way to check if the standard is violated anywhere in the package using static code analysis tools, like pylint
, pyflakes
, pychecker
, pep8
?
Example of violation:
from my_package import my_module
from django.db import models
import os
Correct way to import:
import os
from django.db import models
from my_package import my_module
The current version of pylint now does this, and reports it as error class C0411.
Update (2016): sbywater has the most recent answer.
Found it! (accidentally, while reading "Hacker's guide to python")
OpenStack Hacking Style Checks project named hacking introduces several unique flake8
extensions. There is hacking_import_groups among them (related commit).
Example:
-
requirements
- tox
- flake8
-
hacking (from the master branch):
$ git clone https://github.com/openstack-dev/hacking.git $ cd hacking/ $ python setup.py install
-
files used in the example
-
tox.ini
(we need to tell flake8 that we want to use a custom check)[hacking] local-check = hacking.core.hacking_import_groups
UPD: with the newest version of
hacking
the path to the check changed, now it ishacking.checks.imports.hacking_import_groups
. -
test.py
(target of the check)import requests import sys from my_module import print_smth print_smth(requests.get('https://google.com')) print_smth(sys.version)
-
my_module.py
(local import used bytest.py
)def print_smth(smth): print smth
-
Then, if I run flake8
against test.py
:
$ flake8 test.py
test.py:2:1: H305 imports not grouped correctly (requests: third-party, sys: stdlib)
test.py:3:1: H305 imports not grouped correctly (sys: stdlib, my_module.print_smth: project)
test.py:3:1: H306 imports not in alphabetical order (sys, my_module.print_smth)
Then, if I group the imports in the correct order following PEP8
:
import sys
import requests
from my_module import print_smth
print_smth(requests.get('https://google.com'))
print_smth(sys.version)
No warnings found:
$ flake8 test.py
$
Hope this will help somebody in the future.