Как правильно сортировать Python `import x` и` из x import y`?

170

Руководство по стилю Python предлагает группировать импорт следующим образом:

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

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

Однако в нем ничего не говорится о том, как должны быть изложены два различных способа импорта:

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). Пожалуйста, не публикуйте субъективные ответы с указанием собственных предпочтений.

ThiefMaster
источник
20
Пользователю, который проголосовал за это: я не спрашиваю мнения! Пожалуйста, прочитайте последний абзац моего вопроса.
ThiefMaster
9
Я сомневаюсь, что есть «правильный» путь. Что плохого в выборе собственного стиля? Едва ли может быть соглашение, если никто его не знает. И действительно ли это имеет значение? В чем преимущество указания этого?
Стивен Румбальски
6
+1 звучит так, как будто PEP8 должен быть расширен.
hochl
7
Слабость в PEP не обязательно означает, что она нуждается в исправлении.
Игнасио Васкес-Абрамс
2
Я обычно делю импорт на логические группы, а затем сортирую эти небольшие группы по длине строки ... по той простой причине, что они выглядят лучше. Если вы поместите эти логические группы в какой-то логический порядок, то вы сможете довольно быстро выполнять поиск любого импорта (кроме того, Ctrl+Fэто постоянное время, независимо от того, как вы организовываете импорт ...)
Бакуриу

Ответы:

112

Импорт обычно сортируется в алфавитном порядке и описывается в разных местах, кроме 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 автоматически сортирует ваш импорт.

Абхишек
источник
21
Я не понимаю, где вы отвечаете на фактический вопрос ...
liori
3
@liori Я отправил ссылку / релевантные ссылки, в которых указано, как сортировать модули. Поскольку в PEP 8 ничего не упоминается, но многие другие ссылки предлагают использовать такие методы импорта, как этот.
Абхишек
7
Обратите внимание, что речь идет о сортировке import xи from y import zутверждениях относительно друг друга. Я не вижу ответа на этот вопрос в вашем ответе. Вы в основном перебираете часть вопроса, которая уже объясняет способ группировки PEP8 по типу импорта. Если ответ на этот конкретный вопрос есть в некоторых ссылках, пожалуйста, укажите соответствующие части.
Лиори
2
Я хотел бы отметить особое мнение о том, что отсортированные по алфавиту операторы импорта легче читать. Я считаю, что их гораздо сложнее читать по сравнению с инструкциями импорта, отсортированными по длине. Если вы сортируете лексически в пределах заданной группы длины, это будет хорошо и даже может быть полезно. Но я бы обнаружил, что import datetimeза ним import os гораздо труднее читать, чем import osза ним import datetime. И разница в их поиске с учетом лексической сортировки и не лексической сортировки настолько тривиальна, что совершенно не имеет значения, даже незначительным образом.
Ely
Какой порядок следует использовать для частного и общественного импорта? ( import _tkinterпротив import unittest)
Стевойсяк
30

Согласно внутренним соглашениям CIA о кодировании (часть утечки из WikiLeaks Vault 7 ), импорт python должен быть сгруппирован в три группы:

  1. Импорт стандартной библиотеки
  2. Сторонний импорт
  3. Импорт приложений

Импорт должен быть упорядочен лексикографически в этих группах, игнорируя регистр:

import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar
гар
источник
23
Принято за фактор смеха, что это руководящие принципы стиля кодирования ЦРУ. Очень умно, но в то же время актуально, учитывая уровень экспертизы этих разработчиков.
Тайлер Джеймс Харден
5
это дословное руководство по стилю Google Python
Marius Mucenicu
1
Но из примера не from x import yследует, следует ли до или после from y import x- имя модуля или фактический импорт, определяющий порядок?
Никлас Р.
1
Я знаю, что это шутка, но как истинный ботаник, я хочу отметить, что это на самом деле исходит от PEP8
Марат
8

ПКП 8 ничего не говорит об этом на самом деле. Здесь нет соглашения по этому вопросу, и это не означает, что сообщество Python должно определять его абсолютно. Выбор может быть лучше для проекта, но худший для другого ... Это вопрос предпочтений, поскольку у каждого решения есть свои плюсы и минусы. Но если вы хотите следовать соглашениям, вы должны уважать основной порядок, который вы цитировали:

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

Например, Google рекомендует на этой странице , что импорт должен быть отсортирован лексически , в каждой из категорий (стандарт / третьих лиц / Yours). Но в Facebook, Yahoo и так далее, возможно, это другое соглашение ...

Максим Лорант
источник
0

Все 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
Аститва Шривастава
источник
0

Я чувствую, что принятый ответ слишком многословен. Вот TLDR:

В каждой группе импорт должен быть отсортирован лексикографически, без учета регистра, в соответствии с полным путем пакета каждого модуля.

Руководство по стилю кода Google

Итак, третий вариант верен:

import abc
import def
from g import yy  # changed gg->yy for illustrative purposes
import x
from xx import xx
Марат
источник