Стандарт кодирования порядка импорта

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

Ответ 1

Текущая версия pylint теперь делает это и сообщает об этом как об ошибке класса C0411.

Ответ 2

Обновление (2016): sbywater имеет самый последний ответ.


Нашел это! (случайно, читая "Руководство хакера по питону")

Проект OpenStack Hacking Style Checks под названием hacking представляет несколько уникальных расширений flake8. Среди них есть hacking_import_groups (связанные commit).

Пример:

  • требования

  • файлы, используемые в примере

    • 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
$

Надеюсь, это поможет кому-нибудь в будущем.

Ответ 3

Посмотрите 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

Ответ 4

Плагин flake8 существует: flake8-import-order.

Этот пакет добавляет 3 новых предупреждения flake8

I100: ваши операторы импорта находятся в неправильном порядке.

I101: имена из вашего импорта находятся в неправильном порядке.

I201: отсутствует перевод строки между разделами или импортом.