Ответ 1
Текущая версия pylint теперь делает это и сообщает об этом как об ошибке класса C0411.
PEP8 предполагает, что:
Импорт должен быть сгруппирован в следующем порядке:
- импорт стандартной библиотеки
- Связанный импорт третьей стороны
- импорт локальных приложений/библиотек
Вы должны поместить пустую строку между каждой группой импорта.
Есть ли способ проверить, нарушен ли стандарт в любом месте пакета, используя инструменты для анализа статического кода, такие как pylint
, pyflakes
, pychecker
, pep8
?
Пример нарушения:
from my_package import my_module
from django.db import models
import os
Правильный способ импорта:
import os
from django.db import models
from my_package import my_module
Текущая версия pylint теперь делает это и сообщает об этом как об ошибке класса C0411.
Обновление (2016): sbywater имеет самый последний ответ.
Нашел это! (случайно, читая "Руководство хакера по питону")
Проект OpenStack Hacking Style Checks под названием hacking представляет несколько уникальных расширений flake8
. Среди них есть hacking_import_groups (связанные commit).
Пример:
требования
взлом (из основной ветки):
$ git clone https://github.com/openstack-dev/hacking.git
$ cd hacking/
$ python setup.py install
файлы, используемые в примере
tox.ini
(нам нужно сообщить flake8, что мы хотим использовать пользовательскую проверку)
[hacking]
local-check = hacking.core.hacking_import_groups
UPD: в последней версии hacking
изменился путь к проверке, теперь это hacking.checks.imports.hacking_import_groups
.
test.py
(цель проверки)
import requests
import sys
from my_module import print_smth
print_smth(requests.get('https://google.com'))
print_smth(sys.version)
my_module.py
(локальный импорт используется test.py
)
def print_smth(smth):
print smth
Затем, если я запущу flake8
против 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)
Затем, если я сгруппирую импорт в правильном порядке, следуя PEP8
:
import sys
import requests
from my_module import print_smth
print_smth(requests.get('https://google.com'))
print_smth(sys.version)
Предупреждений не найдено:
$ flake8 test.py
$
Надеюсь, это поможет кому-нибудь в будущем.
Посмотрите https://pypi.python.org/pypi/isort или https://github.com/timothycrosley/isort
isort анализирует указанные файлы для строк импорта глобального уровня (импорт за пределами блоков try/excepts, функций и т.д.) и помещает их в верхнюю часть файла, сгруппированного по типу импорта:
- Будущее
- Стандартная библиотека Python
- Сторонняя сторона
- Текущий проект Python
- Явно локально (перед импортом, как в: from. import x)
Пользовательские отдельные разделы (Определено параметром принудительной_сепарации в файле конфигурации) Внутри каждого раздела импорт сортируется по алфавиту. isort автоматически удаляет дубликаты импорта python и долго переносит от импорта до указанной длины строки (по умолчанию - 80).
https://pypi.python.org/pypi/flake8-isort подключает эту функцию к flake8
Плагин flake8
существует: flake8-import-order.
Этот пакет добавляет 3 новых предупреждения flake8
I100: ваши операторы импорта находятся в неправильном порядке.
I101: имена из вашего импорта находятся в неправильном порядке.
I201: отсутствует перевод строки между разделами или импортом.