Імпортувати стандарт кодування замовлення


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%. Хоча це коштує грошей.
Клаудіу

5
@Claudiu - Pycharm також має версію спільноти.
Amit Verma

3
Якщо ви в кінцевому підсумку щось не знайдете, ви можете написати власний плагін pylint, щоб перевірити це для вас. Погляньте на pylint-plugin-utils та приклад плагіна тут . (Це, можливо, більше підходить як коментар, але я не маю репутації коментувати.)
mobeets

Відповіді:


70

Поточна версія pylint тепер це робить і повідомляє про це як про помилку класу C0411.


9
Зараз це має бути відповідь з більшим голосом. Для більш пізніх версій, які більше не відображають номери помилок, це клас помилок wrong-import-order.
Soren Bjornstad

54

Оновлення (2016): sbywater має останню відповідь.


Знайшов це! (випадково під час читання "Посібника хакера до python")

Проект перевірки стилю хакерства OpenStack під назвою хакерство представляє кілька унікальних 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
Ви повинні нагородити себе :-). Приємно знайти btw, я міг би почати використовувати це сам
Тім,

2
Вони взяли цей чек, посилаючись на те, що він був занадто схильним до помилок і важким: github.com/openstack-dev/hacking/commit/…
jobevers

@jobevers дякую за оновлення! Ну, я використовував його без проблем :)
alecxe

26

Подивіться на https://pypi.python.org/pypi/isort або https://github.com/timothycrosley/isort

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

  • Майбутнє
  • Стандартна бібліотека Python
  • Третя сторона
  • Поточний проект Python
  • Явно локальний (. Перед імпортом, як у: від. Import x)

Спеціальні окремі розділи (визначаються примусовим_окремим списком у файлі конфігурації) Усередині кожного розділу імпорт сортується за алфавітом. isort автоматично видаляє дублікати імпортування python та обтікає довге імпортування до вказаної довжини рядка (за замовчуванням - 80).

https://pypi.python.org/pypi/flake8-isort підключає цю функцію до flake8


2
Тільки зауважте, що якщо ви запустите isort script_name.py --check-only- він перевірить лише на невідсортований імпорт та роздрукує результати - це те, що мені потрібно. Щиро дякую за варіант.
alecxe

isort -rc --check --diffперевіряти всі файли рекурсивно, тільки перевірка, відображення диф
ptim

7

Існує flake8плагін: flake8-import-order .

Цей пакет додає 3 нових попередження flake8

I100: Ваші заяви про імпорт розміщені в неправильному порядку.

I101: Імена у вашому імпорті від неправильного порядку.

I201: Відсутній новий рядок між розділами або імпортом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.