Was ist der richtige Weg, um Python-Anweisungen "import x" und "from x import y" zu sortieren?

168

Der Python-Styleguide schlägt vor, Importe wie folgt zu gruppieren:

Importe sollten in der folgenden Reihenfolge gruppiert werden:

  1. Standardbibliotheksimporte
  2. verwandte Importe von Dritten
  3. lokale anwendungs- / bibliotheksspezifische Importe

Es wird jedoch nichts darüber erwähnt, wie die beiden verschiedenen Arten der Einfuhr dargelegt werden sollten:

from foo import bar
import foo

Es gibt mehrere Möglichkeiten, sie zu sortieren (nehmen wir an, dass alle diese Importe zur selben Gruppe gehören):

  • zuerst from..importdannimport

    from g import gg
    from x import xx
    import abc
    import def
    import x
    
  • zuerst importdannfrom..import

    import abc
    import def
    import x
    from g import gg
    from x import xx
    
  • alphabetische Reihenfolge nach Modulnamen, wobei die Art des Imports ignoriert wird

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

PEP8 erwähnt die bevorzugte Reihenfolge hierfür nicht und die "Bereinigungsimporte" -Funktionen, die einige IDEs wahrscheinlich nur tun, was auch immer der Entwickler dieser Funktion bevorzugt.

Ich suche nach einem anderen PEP, der dies oder einen relevanten Kommentar / eine relevante E-Mail von der BDFL (oder einem anderen Python-Kernentwickler) klarstellt . Bitte posten Sie keine subjektiven Antworten, die Ihre eigenen Vorlieben angeben.

DiebMaster
quelle
20
An den Benutzer, der dafür gestimmt hat: Ich frage nicht nach Meinungen! Bitte lesen Sie den letzten Absatz meiner Frage.
ThiefMaster
9
Ich bezweifle, dass es einen "richtigen" Weg gibt. Was ist falsch daran, deinen eigenen Stil zu wählen? Es kann kaum eine Konvention geben, wenn niemand es weiß. Und ist das wirklich wichtig? Was ist der Vorteil, wenn dies angegeben wird?
Steven Rumbalski
6
+1 klingt so, als ob PEP8 erweitert werden sollte.
hochl
7
Eine Schwäche in einem PEP bedeutet nicht unbedingt, dass es geändert werden muss.
Ignacio Vazquez-Abrams
2
Normalerweise teile ich Importe in logische Gruppen ein und sortiere diese kleinen Gruppen dann nach Zeilenlänge ... aus dem einfachen Grund, dass sie besser aussehen . Wenn Sie diese logischen Gruppen in eine irgendwie logische Reihenfolge bringen, können Sie ziemlich schnell nach jedem Import suchen (außerdem Ctrl+Fist die Zeit konstant, egal wie Sie Importe organisieren ...)
Bakuriu

Antworten:

110

Importe werden in der Regel alphabetisch sortiert und an verschiedenen Stellen neben PEP 8 beschrieben.

Alphabetisch sortierte Module sind schneller zu lesen und durchsuchbar . Schließlich dreht sich bei Python alles um Lesbarkeit. Außerdem ist es einfacher zu überprüfen, ob etwas importiert wurde, und es werden doppelte Importe vermieden

In PEP 8 ist nichts zum Sortieren verfügbar. Es geht also nur um die Auswahl, was Sie verwenden.

Nach wenigen Referenzen von seriösen Websites und Repositories, die ebenfalls beliebt sind, ist die alphabetische Reihenfolge der richtige Weg.

für zB so:

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

ODER

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

Das offizielle Reddit-Repository gibt außerdem an, dass im Allgemeinen die PEP-8-Importreihenfolge verwendet werden sollte. Es gibt jedoch einige Ergänzungen

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

Verweise:

PS: Das Dienstprogramm isort sortiert Ihre Importe automatisch.

Abhishek
quelle
20
Ich sehe nicht, wo Sie die eigentliche Frage beantworten ...
Liori
3
@liori Ich habe eine Referenz / relevante Links eingereicht, die angeben, wie Module sortiert werden. Da PEP 8 nichts erwähnt, empfehlen viele andere Referenzen die Verwendung solcher Importmethoden.
Abhishek
7
Beachten Sie, dass es bei der Frage um Sortierung import xund from y import zAnweisungen relativ zueinander geht. Ich sehe keine Antwort auf diese Frage in Ihrer Antwort. Sie wiederholen im Grunde einen Teil der Frage, die bereits die PEP8-Art der Gruppierung nach Importtyp erklärt. Wenn eine Antwort auf diese spezielle Frage in einigen Links enthalten ist, zitieren Sie bitte die relevanten Teile.
Liori
2
Ich möchte eine abweichende Ansicht zu der Behauptung zur Kenntnis nehmen, dass alphabetisch sortierte Importanweisungen leichter zu lesen sind. Ich finde sie viel schwieriger zu lesen als Importanweisungen, die nach Länge sortiert sind. Wenn Sie innerhalb einer bestimmten Längengruppe lexikalisch sortieren, ist dies in Ordnung und kann sogar von Vorteil sein. Aber ich würde import datetimegefolgt von import os viel schwerer zu lesen finden als import osgefolgt von import datetime. Und der Unterschied bei der Suche nach ihnen bei lexikalischer Sortierung gegenüber nicht lexikalisch sortiert ist so trivial, dass er auch in keiner geringfügigen Weise völlig von Bedeutung ist.
Ely
Welche Reihenfolge sollte für private oder öffentliche Importe verwendet werden? ( import _tkintervs import unittest)
Stevoisiak
28

Gemäß den internen Codierungskonventionen der CIA (Teil des WikiLeaks Vault 7-Lecks ) sollten Python-Importe in drei Gruppen eingeteilt werden:

  1. Standardbibliotheksimporte
  2. Importe von Drittanbietern
  3. Anwendungsspezifische Importe

Importe sollten innerhalb dieser Gruppen lexikographisch angeordnet werden, wobei der Fall ignoriert wird:

import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar
gar
quelle
22
Für den Lachfaktor, dass es sich um die Kodierungsrichtlinien der CIA handelt, positiv bewertet. Sehr clever, aber gleichzeitig relevant angesichts des Fachwissens dieser Entwickler.
Tyler James Harden
5
Das ist wörtlich Google Python Style Guide
Marius Mucenicu
1
Aus dem Beispiel folgt jedoch nicht, ob from x import yvorher oder nachher sein soll from y import x- ist es der Name des Moduls oder der tatsächliche Import, der die Reihenfolge bestimmt?
Niklas R.
1
Ich weiß, dass es ein Witz ist, aber als richtiger Nerd möchte ich darauf hinweisen, dass dies tatsächlich von PEP8
Marat
8

Das PEP 8 sagt tatsächlich nichts darüber aus. Für diesen Punkt gibt es keine Konvention, und dies bedeutet nicht, dass die Python-Community eine unbedingt definieren muss. Eine Wahl kann für ein Projekt besser sein, für ein anderes jedoch die schlechteste ... Es ist eine Frage der Präferenzen dafür, da jede Lösung Vor- und Nachteile hat. Wenn Sie jedoch Konventionen befolgen möchten, müssen Sie die von Ihnen angegebene Hauptreihenfolge einhalten:

  1. Standardbibliotheksimporte
  2. verwandte Importe von Dritten
  3. lokale anwendungs- / bibliotheksspezifische Importe

Beispielsweise empfiehlt Google auf dieser Seite , den Import in jeder Kategorie (Standard / Dritte / Ihre) lexikografisch zu sortieren . Aber bei Facebook, Yahoo und was auch immer ist es vielleicht eine andere Konvention ...

Maxime Lorant
quelle
0

Alle import xAnweisungen sollten nach dem Wert von sortiert sein, xund alle from x import yAnweisungen sollten nach dem Wert von xin alphabetischer Reihenfolge sortiert sein, und die sortierten Gruppen von from x import yAnweisungen müssen der sortierten Gruppe von import xAnweisungen folgen .

import abc
import def
import x
from g import gg
from x import xx
from z import a
Astitva Srivastava
quelle
0

Ich denke, die akzeptierte Antwort ist etwas zu ausführlich. Hier ist TLDR:

Innerhalb jeder Gruppierung sollten Importe lexikografisch sortiert werden, wobei die Groß- und Kleinschreibung ignoriert wird, entsprechend dem vollständigen Paketpfad jedes Moduls

Google Code Style Guide

Die dritte Option ist also richtig:

import abc
import def
from g import yy  # changed gg->yy for illustrative purposes
import x
from xx import xx
Marat
quelle