Каков правильный способ сортировки операторов Python `import x` и` from 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). Пожалуйста, не публикуйте субъективные ответы с указанием ваших собственных предпочтений.
Ответы
Ответ 1
Импорт обычно сортируется в алфавитном порядке и описывается в разных местах рядом с 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
Литература:
PS: утилита isort автоматически сортирует ваш импорт.
Ответ 2
PEP 8 ничего не говорит об этом. Для этого нет никакого соглашения, и это не значит, что сообщество Python должно определить одно абсолютно. Выбор может быть лучше для проекта, но хуже для другого... Это вопрос предпочтений для этого, поскольку у каждого решения есть про и минусы. Но если вы хотите следовать соглашениям, вы должны соблюдать основной заказ, который вы указали:
- импорт стандартной библиотеки
- Связанный импорт третьей стороны
- импорт локальных приложений/библиотек
Например, Google рекомендует на этой странице, что импорт должен быть отсортирован лексикографически, в каждой категории (стандартные/третьи стороны/ваши). Но в Facebook, Yahoo и т.д. Это может быть другое соглашение...
Ответ 3
В соответствии со стандартами внутреннего кодирования ЦРУ (часть WikiLeaks Vault 7 leak), импорт python должен быть сгруппирован в три группы:
- Импорт стандартных библиотек
- Импорт сторонних производителей
- Импорт приложений по конкретным параметрам
Импорт должен быть упорядочен лексикографически внутри этих групп, игнорируя случай:
import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar