Qual è il modo corretto di ordinare le istruzioni `import x` e` from x import y` di Python?


170

La guida di stile di Python suggerisce di raggruppare le importazioni in questo modo:

Le importazioni dovrebbero essere raggruppate nel seguente ordine:

  1. importazioni di librerie standard
  2. importazioni di terzi correlate
  3. importazioni locali specifiche per libreria /

Tuttavia, non menziona nulla su come dovrebbero essere definiti i due diversi modi di importazione:

from foo import bar
import foo

Esistono diversi modi per ordinarli (supponiamo che tutte le importazioni appartengano allo stesso gruppo):

  • prima from..import, quindiimport

    from g import gg
    from x import xx
    import abc
    import def
    import x
  • prima import, quindifrom..import

    import abc
    import def
    import x
    from g import gg
    from x import xx
  • ordine alfabetico per nome del modulo, ignorando il tipo di importazione

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

PEP8 non menziona l'ordine preferito per questo e le funzionalità di "cleanup import" che alcuni IDE hanno probabilmente fatto qualunque cosa lo sviluppatore di quella funzionalità preferisse.

Sto cercando un altro PEP che chiarisca questo o un commento / e-mail pertinente dal BDFL (o da un altro sviluppatore core di Python). Si prega di non pubblicare risposte soggettive indicando le proprie preferenze.


20
Per l'utente che ha votato per chiudere questa: io sono , non chiedendo opinioni! Si prega di leggere l'ultimo paragrafo della mia domanda.
ThiefMaster

9
Dubito che esista un modo "corretto". Cosa c'è di sbagliato nel scegliere il tuo stile su questo? Difficilmente può esserci una convenzione se nessuno lo sa. Ed è veramente importante? Qual è il vantaggio di avere questo specificato?
Steven Rumbalski,

6
+1 suona come PEP8 dovrebbe essere esteso.
Hochl,

7
Una debolezza in un PEP non significa necessariamente che debba essere modificata.
Ignacio Vazquez-Abrams,

2
Di solito divido le importazioni in gruppi logici e poi ordino questi piccoli gruppi per lunghezza della linea ... per la semplice ragione che sembrano più belli. Se metti questi gruppi logici in un ordine in qualche modo logico, puoi cercare qualsiasi importazione abbastanza velocemente (oltre al Ctrl+Ftempo costante, indipendentemente da come organizzi le importazioni ...)
Bakuriu,

Risposte:


112

Le importazioni sono generalmente classificate in ordine alfabetico e descritte in vari punti accanto a PEP 8.

I moduli ordinati alfabeticamente sono più veloci da leggere e ricercabili . Dopo tutto, Python è tutto sulla leggibilità. Inoltre, è più facile verificare che qualcosa venga importato ed evita duplicazioni

In PEP 8 non è disponibile nulla per quanto riguarda l'ordinamento, quindi tutto dipende dalla scelta di ciò che si utilizza.

Secondo alcuni riferimenti da siti affidabili e depositi anche la popolarità, l'ordinamento alfabetico è la strada.

per esempio in questo modo:

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

O

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

Il repository ufficiale Reddit afferma inoltre che, in generale, è necessario utilizzare gli ordini di importazione PEP-8. Tuttavia ci sono alcune aggiunte che è

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

Riferimenti:

PS: l' utility isort ordina automaticamente le tue importazioni.


21
Non vedo dove stai rispondendo alla domanda reale ...
liori

3
@liori Ho inviato un riferimento / collegamenti rilevanti che indicano come ordinare i moduli. Poiché PEP 8 non menziona nulla, ma molti altri riferimenti suggeriscono di utilizzare metodi di importazione come questo.
Abhishek,

7
Si noti che la domanda riguarda l'ordinamento import xe le from y import zdichiarazioni l'una rispetto all'altra. Non vedo nessuna risposta a questa domanda nella tua risposta. Fondamentalmente stai riaffermando una parte della domanda che già spiega il modo di raggruppamento PEP8 per tipo di importazione. Se una risposta a questa domanda specifica si trova in alcuni dei collegamenti, si prega di citare le parti pertinenti.
liori,

2
Vorrei notare una tesi dissenziente sull'affermazione secondo cui le dichiarazioni di importazione ordinate alfabeticamente sono più facili da leggere. Li trovo molto più difficili da leggere rispetto alle dichiarazioni di importazione ordinate per lunghezza. Se si ordina in modo lessicale all'interno di un determinato gruppo di lunghezza, ciò andrebbe bene e potrebbe anche essere utile. Ma troverei import datetimeseguito import os molto più difficile da leggere rispetto a quello import osseguito import datetime. E la differenza nella loro ricerca data l'ordinamento lessicale rispetto a quello non lessicale è così banale da non avere alcuna importanza nemmeno in alcun modo.
ely,

Quale ordine dovrebbe essere usato per le importazioni private vs pubbliche? ( import _tkintervs import unittest)
Stevoisiak,

30

Secondo le convenzioni di codifica interne della CIA (parte della perdita di WikiLeaks Vault 7 ), le importazioni di pitone dovrebbero essere raggruppate in tre gruppi:

  1. Importazioni di librerie standard
  2. Importazioni di terze parti
  3. Importazioni specifiche dell'applicazione

Le importazioni dovrebbero essere ordinate lessicograficamente all'interno di questi gruppi, ignorando il caso:

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

23
Valutato per il fattore risata che sono le linee guida di stile di codifica della CIA. Molto intelligente, ma allo stesso tempo rilevante dato il livello di competenza proveniente da quegli sviluppatori.
Tyler James Harden,



1
Ma dall'esempio non segue se from x import ydovrebbe essere prima o dopo from y import x- è il nome del modulo o l'importazione effettiva che determina l'ordine?
Niklas R.,

1
So che è uno scherzo, ma come un vero secchione voglio sottolineare che questo in realtà proviene da PEP8
Marat

8

Il PEP 8 non dice nulla al riguardo. Non esiste una convenzione per questo punto, e non significa che la comunità Python debba definirne assolutamente uno. Una scelta può essere migliore per un progetto, ma la peggiore per un altro ... È una questione di preferenze per questo, poiché ogni soluzione ha pro e contro. Ma se vuoi seguire le convenzioni, devi rispettare l'ordine principale che hai citato:

  1. importazioni di librerie standard
  2. importazioni di terzi correlate
  3. importazioni locali specifiche per libreria /

Ad esempio, Google raccomanda in questa pagina che di importazione deve essere ordinato lexicographically , in ogni categoria (/ terzi / vostri standard). Ma su Facebook, Yahoo e quant'altro, è forse un'altra convenzione ...



0

Tutte le import xistruzioni devono essere ordinate in base al valore di xe tutte le from x import yistruzioni devono essere ordinate in base al valore di xin ordine alfabetico e i gruppi ordinati di from x import yistruzioni devono seguire il gruppo ordinato di import xistruzioni.

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

0

Sento che la risposta accettata è un po 'troppo dettagliata. Ecco TLDR:

All'interno di ciascun gruppo, le importazioni dovrebbero essere ordinate lessicograficamente, ignorando il caso, in base al percorso completo del pacchetto di ciascun modulo

Guida allo stile del codice di Google

Quindi, la terza opzione è corretta:

import abc
import def
from g import yy  # changed gg->yy for illustrative purposes
import x
from xx import xx
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.