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

84

PEP8 предполагает, что:

Импорты следует сгруппировать в следующем порядке:

  1. стандартная библиотека импорта
  2. связанный сторонний импорт
  3. импорт для локального приложения / библиотеки

Вы должны поместить пустую строку между каждой группой импорта.

Есть ли способ , чтобы проверить , если стандарт нарушается нигде в пакете с помощью инструментов статического анализа кода, как 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
pep8Инструмент не в настоящее время проверить это - это только проверку на наличие нескольких импорта на одной линии (E401)
ДНК
@DNA полезно знать, спасибо. Надеюсь, что там что-то есть.
alecxe
PyCharm может это сделать, но я не уверен на 100%. Однако это стоит денег.
Claudiu
5
@Claudiu - Pycharm также имеет версию сообщества.
Амит Верма
3
Если вы ничего не найдете, вы можете написать свой собственный плагин pylint, чтобы проверить это за вас. Взгляните на pylint-plugin-utils и пример плагина здесь . (Это может быть лучше подходит в качестве комментария, но у меня нет репутации, чтобы комментировать.)
mobeets

Ответы:

70

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

Sbywater
источник
9
Теперь за этот ответ должны проголосовать больше людей. Для более поздних версий, в которых больше не отображаются номера ошибок, это класс ошибки wrong-import-order.
Soren Bjornstad
54

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


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

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

Пример:

  • требования

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

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

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

алексе
источник
1
Вы должны присудить награду себе :-). Хорошая находка, кстати, я мог бы начать использовать это сам
Тим
2
Они
вынули
@jobevers, спасибо за обновление! Ну, я без проблем
воспользовался
26

Взгляните на https://pypi.python.org/pypi/isort или https://github.com/timothycrosley/isort

isort анализирует указанные файлы на предмет строк импорта на глобальном уровне (импорт вне блоков try / excepts, функций и т. д.) и помещает их все в начало файла, сгруппированные вместе по типу импорта:

  • Будущее
  • Стандартная библиотека Python
  • Третье лицо
  • Текущий проект Python
  • Явно локальный (. Перед импортом, например: from. Import x)

Пользовательские отдельные разделы (определяются списком Force_separate в файле конфигурации) Внутри каждого раздела импорт сортируется в алфавитном порядке. isort автоматически удаляет дублирующийся импорт Python и переносит long от импорта до указанной длины строки (по умолчанию 80).

https://pypi.python.org/pypi/flake8-isort подключает эту функциональность к flake8

умнее
источник
2
Просто обратите внимание, что если вы запустите isort script_name.py --check-only- он будет проверять только несортированный импорт и распечатывать результаты - это то, что мне нужно. Большое спасибо за вариант.
alecxe 01
isort -rc --check --diffпроверять все файлы рекурсивно, только проверять, отображать
разницу
7

flake8Плагин существует: flake8-импорт-заказ .

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

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

I101: Имена в файле from import расположены в неправильном порядке.

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

Феникс
источник