Jaki jest prawidłowy sposób sortowania instrukcji `import x` i` from x import y` w Pythonie?

170

Przewodnik po stylu Pythona sugeruje grupowanie importów w następujący sposób:

Import należy pogrupować w następującej kolejności:

  1. standardowe importy bibliotek
  2. powiązany import stron trzecich
  3. import lokalnych aplikacji / bibliotek

Jednak nie wspomina o tym, jak powinny wyglądać dwa różne sposoby importu:

from foo import bar
import foo

Istnieje wiele sposobów ich sortowania (załóżmy, że wszystkie te importy należą do tej samej grupy):

  • najpierw from..importwięcimport

    from g import gg
    from x import xx
    import abc
    import def
    import x
  • najpierw importwięcfrom..import

    import abc
    import def
    import x
    from g import gg
    from x import xx
  • kolejność alfabetyczna według nazwy modułu, ignorując rodzaj importu

    import abc
    import def
    from g import gg
    import x
    from xx import xx

PEP8 nie wspomina o preferowanej kolejności, a funkcje „importu po czyszczeniu” niektóre IDE prawdopodobnie po prostu robią to, co preferuje twórca tej funkcji.

Szukam innego PEP wyjaśniającego to lub odpowiedniego komentarza / e-maila od BDFL (lub innego programisty Python core). Prosimy nie publikować subiektywnych odpowiedzi określających własne preferencje.

ThiefMaster
źródło
20
Dla użytkownika, który głosował zamknąć to: Ja nie pytając o opinie! Przeczytaj ostatni akapit mojego pytania.
ThiefMaster
9
Wątpię, czy istnieje „właściwy” sposób. Co jest złego w wybieraniu własnego stylu? Nie może być konwentu, jeśli nikt o tym nie wie. I czy to naprawdę ma znaczenie? Jaka jest zaleta określenia tego?
Steven Rumbalski
6
+1 brzmi jak PEP8 powinno zostać przedłużone.
hochl
7
Słabość w PEP niekoniecznie oznacza, że ​​wymaga on zmian.
Ignacio Vazquez-Abrams
2
Zwykle dzielę import na logiczne grupy, a następnie sortuję te małe grupy według długości linii ... z tego prostego powodu, że wyglądają ładniej. Jeśli umieścisz te logiczne grupy w jakimś logicznym porządku, możesz dość szybko wyszukać dowolny import (poza tym Ctrl+Fstały czas bez względu na to, jak zorganizujesz import ...)
Bakuriu

Odpowiedzi:

112

Import jest generalnie sortowany alfabetycznie i opisywany w różnych miejscach poza PEP 8.

Moduły posortowane alfabetycznie są szybsze w czytaniu i wyszukiwaniu . W końcu w Pythonie chodzi o czytelność. Ponadto łatwiej jest sprawdzić, czy coś jest zaimportowane, i unika się powielania importu

W PEP 8 nie ma nic, co dotyczy sortowania, więc wszystko zależy od wyboru tego, czego używasz.

Według nielicznych odniesień z renomowanych witryn i repozytoriów również popularność, porządek alfabetyczny jest drogą.

na przykład tak:

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

LUB

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

Oficjalne repozytorium Reddit stwierdza również, że generalnie należy stosować zamawianie importu PEP-8. Jest jednak kilka dodatków

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

Bibliografia:

PS: narzędzie isort automatycznie sortuje import.

Abhishek
źródło
21
Nie wiem, gdzie odpowiadasz na rzeczywiste pytanie…
liori
3
@liori Przesłałem referencję / odpowiednie linki określające sposób sortowania modułów. Ponieważ PEP 8 nic nie wspomina, ale wiele innych odniesień sugeruje użycie takich metod importu.
Abhishek
7
Zwróć uwagę, że pytanie dotyczy sortowania import xi from y import zstwierdzeń względem siebie. W twojej odpowiedzi nie widzę odpowiedzi na to pytanie. Zasadniczo powtarzasz część pytania, która już wyjaśnia sposób grupowania PEP8 według typu importu. Jeśli odpowiedź na to konkretne pytanie znajduje się w którymś z linków, zacytuj odpowiednie części.
liori
2
Chciałbym zwrócić uwagę na zdanie odrębne dotyczące twierdzenia, że ​​zestawienia importu posortowane alfabetycznie są bardziej czytelne. Uważam je za znacznie trudniejsze do odczytania w porównaniu z instrukcjami importu posortowanymi według długości. Jeśli posortowałeś leksykalnie w ramach danej grupy długości, byłoby to w porządku, a nawet może być korzystne. Ale uważam, że import datetimepo nim następuje import os dużo trudniejsze do odczytania niż import osśledzenie import datetime. A różnica w wyszukiwaniu ich według sortowania leksykalnego i bez sortowania leksykalnego jest tak banalna, że ​​zupełnie nie ma znaczenia, nawet w najmniejszym stopniu.
ely
Jakiej kolejności należy użyć w przypadku importu prywatnego i publicznego? ( import _tkintervs import unittest)
Stevoisiak
30

Zgodnie z wewnętrznymi konwencjami kodowania CIA (część przecieku WikiLeaks Vault 7 ), import Pythona należy podzielić na trzy grupy:

  1. Importy bibliotek standardowych
  2. Import stron trzecich
  3. Importy specyficzne dla aplikacji

Import należy uporządkować leksykograficznie w tych grupach, ignorując wielkość liter:

import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar
gar
źródło
23
Głosowano za śmiechem, że są to wytyczne CIA dotyczące stylu kodowania. Bardzo sprytny, ale jednocześnie odpowiedni, biorąc pod uwagę poziom wiedzy tych programistów.
Tyler James Harden
5
to jest dosłownie przewodnik po stylu Pythona w Google
Marius Mucenicu Kwietnia
1
Ale z przykładu nie wynika, czy from x import ypowinno być przed, czy po from y import x- czy to nazwa modułu, czy faktyczny import decyduje o zamówieniu?
Niklas R.
1
Wiem, że to żart, ale jako prawdziwy nerd chcę zaznaczyć, że tak naprawdę pochodzi z PEP8
Marat
8

PEP 8 rzeczywiście nic o tym nie mówi. Nie ma żadnej konwencji w tym punkcie i nie oznacza to, że społeczność Pythona musi ją absolutnie definiować. Wybór może być lepszy dla projektu, ale najgorszy dla innego ... To kwestia preferencji, ponieważ każde rozwiązanie ma wady i zalety. Ale jeśli chcesz postępować zgodnie z konwencjami, musisz uszanować podaną przez siebie główną kolejność:

  1. standardowe importy bibliotek
  2. powiązany import stron trzecich
  3. import lokalnych aplikacji / bibliotek

Na przykład Google zaleca na tej stronie, aby import był posortowany leksykograficznie w każdej kategorii (standardowa / osoby trzecie / Twoja). Ale na Facebooku, Yahoo i tak dalej, to może inna konwencja ...

Maxime Lorant
źródło
0

Wszystkie import xzestawienia należy posortować według wartości, xa wszystkie from x import yzestawienia według wartości xalfabetu, a posortowane grupy from x import yzdań muszą znajdować się po posortowanej grupie import xzdań.

import abc
import def
import x
from g import gg
from x import xx
from z import a
Astitva Srivastava
źródło
0

Wydaje mi się, że zaakceptowana odpowiedź jest nieco zbyt szczegółowa. Oto TLDR:

W ramach każdej grupy importy powinny być sortowane leksykograficznie, z pominięciem wielkości liter, zgodnie z pełną ścieżką pakietu każdego modułu

Przewodnik po stylach kodu Google

Tak więc trzecia opcja jest poprawna:

import abc
import def
from g import yy  # changed gg->yy for illustrative purposes
import x
from xx import xx
Marat
źródło