Який правильний спосіб сортувати 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). Будь ласка, не публікуйте суб’єктивних відповідей із зазначенням власних уподобань.


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 за типом імпорту. Якщо відповідь на це конкретне питання є у деяких із посилань, будь ласка, цитуйте відповідні частини.
liori

2
Я хотів би відзначити незгодний погляд на те, що алфавітно відсортовані заяви про імпорт легше читати. Мені їх важче читати порівняно із заявами про імпорт, відсортованими за довжиною. Якщо ви сортуєте лексично в межах певної групи довжини, це було б добре і навіть може бути корисним. Але я вважаю, що import datetimeза цим читатимуться import os набагато важче, ніж import osза ним import datetime. І різниця в пошуку їх за лексичним сортуванням проти не лексично відсортованим настільки тривіальна, що зовсім не має значення навіть незначним чином.
ely

Яке замовлення слід використовувати для приватного та державного імпорту? ( import _tkinterпроти import unittest)
Stevoisiak

30

Відповідно до внутрішніх угод про кодування ЦРУ (частина витоку WikiLeaks Vault 7 ), імпорт пітонів слід згрупувати у три групи:

  1. Стандартний імпорт бібліотеки
  2. Імпорт сторонніх виробників
  3. Спеціальний імпорт

Імпорт слід упорядковувати лексикографічно в межах цих груп, ігноруючи регістр:

import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar

23
За фактор сміху вважають, що це правила керівництва CIA щодо стилю кодування. Дуже розумний, але в той же час доречний, враховуючи рівень знань тих розробників.
Тайлер Джеймс Гарден



1
Але це не випливає з прикладу, якщо це from x import yповинно бути до чи після from y import x- це ім'я модуля чи фактичний імпорт, який визначає порядок?
Ніклас Р.

1
Я знаю, що це жарт, але як належний ботанік хочу зазначити, що це насправді йде від PEP8
Марат

8

PEP 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.