Каков правильный способ сортировки операторов 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