Как правильно сортировать Python `import x` и` из x import y`?
Руководство по стилю Python предлагает группировать импорт следующим образом:
Импорт должен быть сгруппирован в следующем порядке:
- импорт стандартной библиотеки
- связанный сторонний импорт
- локальный импорт приложений / библиотек
Однако в нем ничего не говорится о том, как должны быть изложены два различных способа импорта:
from foo import bar
import foo
Существует несколько способов их сортировки (предположим, что все эти импортные файлы принадлежат одной и той же группе):
первый
from..import
, затемimport
from g import gg from x import xx import abc import def import x
первый
import
, затемfrom..import
import abc import def import x from g import gg from x import xx
алфавитный порядок по имени модуля, игнорируя вид импорта
import abc import def from g import gg import x from xx import xx
В PEP8 не упоминается предпочтительный порядок для этого, а функции "очистки импорта" некоторые IDE, вероятно, просто делают так, как предпочитает разработчик этой функции.
Я ищу другого PEP, разъясняющего этот или соответствующий комментарий / электронное письмо от BDFL (или другого разработчика ядра Python). Пожалуйста, не публикуйте субъективные ответы с указанием собственных предпочтений.
3 ответа
Импорт обычно сортируется в алфавитном порядке и описывается в разных местах, кроме PEP 8.
Сортированные по алфавиту модули быстрее читаются и доступны для поиска. В конце концов Python все о читаемости. Также легче проверить, что что-то импортировано, и избежать дублирования импорта
В PEP 8 нет ничего доступного для сортировки. Так что все дело в выборе того, что вы используете.
В соответствии с несколькими ссылками с авторитетных сайтов и репозиториев также популярность, алфавитный порядок является способом.
например, вот так:
import httplib
import logging
import random
import StringIO
import time
import unittest
from nova.api import openstack
from nova.auth import users
from nova.endpoint import cloud
ИЛИ ЖЕ
import a_standard
import b_standard
import a_third_party
import b_third_party
from a_soc import f
from a_soc import g
from b_soc import d
Официальный репозиторий Reddit также заявляет, что, как правило, следует использовать порядок импорта PEP-8. Однако есть несколько дополнений, которые
for each imported group the order of imports should be:
import <package>.<module> style lines in alphabetical order
from <package>.<module> import <symbol> style in alphabetical order
Рекомендации:
- https://code.google.com/p/soc/wiki/PythonStyleGuide
- https://github.com/reddit/reddit/wiki/PythonImportGuidelines
- http://docs.openstack.org/developer/hacking/
- http://developer.plone.org/reference_manuals/external/plone.api/contribute/conventions.html
PS: утилита isort автоматически сортирует ваш импорт.
Согласно внутренним соглашениям CIA о кодировании (часть утечки из WikiLeaks Vault 7), импорт python должен быть сгруппирован в три группы:
- Импорт стандартной библиотеки
- Сторонний импорт
- Импорт приложений
Импорт должен быть упорядочен лексикографически в этих группах, игнорируя регистр:
import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar
ПКП 8 ничего не говорит об этом на самом деле. Здесь нет соглашения по этому вопросу, и это не означает, что сообщество Python должно определять его абсолютно. Выбор может быть лучше для проекта, но худший для другого... Это вопрос предпочтений, так как у каждого решения есть свои плюсы и минусы. Но если вы хотите следовать соглашениям, вы должны уважать основной порядок, который вы цитировали:
- импорт стандартной библиотеки
- связанный сторонний импорт
- локальный импорт приложений / библиотек
Например, Google рекомендует на этой странице импортировать сортировку по лексикографически по каждой категории (стандартная / третьи лица / ваша). Но в Facebook, Yahoo и так далее, возможно, это другое соглашение...
Мне кажется, что принятый ответ слишком многословен. Вот TL; DR:
Внутри каждой группы импорт должен быть отсортирован лексикографически, без учета регистра, в соответствии с полным путем к пакету каждого модуля.
Руководство по стилю кода Google
Итак, третий вариант верен:
import abc
import def
from g import yy # changed gg->yy for illustrative purposes
import x
from xx import xx
Я настоятельно рекомендую https://pypi.org/project/reorder-python-imports/. Он следует второму варианту принятого ответа, а также интегрируется в предварительную фиксацию, что очень полезно.
Все import x
заявления должны быть отсортированы по значению x
и все from x import y
заявления должны быть отсортированы по значению x
в алфавитном порядке и отсортированные группы from x import y
заявления должны следовать за отсортированной группой import x
заявления.
import abc
import def
import x
from g import gg
from x import xx
from z import a