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

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

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

Рекомендации:

PS: утилита isort автоматически сортирует ваш импорт.

Согласно внутренним соглашениям 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

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

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

Например, 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
Другие вопросы по тегам