Qual é a maneira correta de classificar as instruções Python `import x` e` from x import y`?

170

O guia de estilo python sugere agrupar importações como esta:

As importações devem ser agrupadas na seguinte ordem:

  1. importações de biblioteca padrão
  2. importações de terceiros relacionadas
  3. importações locais específicas de aplicativos / bibliotecas

No entanto, não menciona nada como devem ser apresentadas as duas formas diferentes de importação:

from foo import bar
import foo

Existem várias maneiras de classificá-las (vamos supor que todas essas importações pertencem ao mesmo grupo):

  • primeiro from..importentãoimport

    from g import gg
    from x import xx
    import abc
    import def
    import x
  • primeiro importentãofrom..import

    import abc
    import def
    import x
    from g import gg
    from x import xx
  • ordem alfabética pelo nome do módulo, ignorando o tipo de importação

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

O PEP8 não menciona a ordem preferida para isso e os recursos "importações de limpeza" que alguns IDEs provavelmente fazem apenas o que o desenvolvedor desse recurso preferir.

Estou procurando outro PEP que esclareça este ou um comentário / email relevante do BDFL (ou outro desenvolvedor principal do Python). Por favor, não poste respostas subjetivas afirmando sua própria preferência.

ThiefMaster
fonte
20
Para o usuário que votaram para fechar esta: Estou não pedir opiniões! Por favor, leia o último parágrafo da minha pergunta.
ThiefMaster
9
Duvido que exista um caminho "correto". O que há de errado em escolher seu próprio estilo nisso? Dificilmente haverá uma convenção se ninguém souber. E isso realmente importa? Qual é a vantagem de ter isso especificado?
Steven Rumbalski
6
+1 soa como PEP8 deve ser estendido.
hochl
7
Uma fraqueza em um PEP não significa necessariamente que ele precise ser alterado.
Ignacio Vazquez-Abrams
2
Normalmente, divido as importações em grupos lógicos e, em seguida, classifico esses pequenos grupos por comprimento de linha ... pela simples razão de que eles parecem mais agradáveis. Se você colocar esses grupos lógicos em uma ordem de alguma forma lógica, então você pode procurar qualquer importação bastante rápido (além Ctrl+Fé tempo constante, não importa como você organiza as importações ...)
Bakuriu

Respostas:

112

As importações são geralmente classificadas em ordem alfabética e descritas em vários lugares ao lado do PEP 8.

Os módulos ordenados alfabeticamente são mais rápidos de ler e pesquisáveis . Afinal python é tudo sobre legibilidade. Também é mais fácil verificar se algo é importado e evita importações duplicadas

Não há nada disponível no PEP 8 em relação à classificação. Portanto, tudo depende da escolha do que você usa.

De acordo com poucas referências de sites e repositórios respeitáveis ​​e também popularidade, a ordem alfabética é o caminho.

por exemplo:

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

OU

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

O repositório oficial do Reddit também afirma que, em geral, o pedido de importação do PEP-8 deve ser usado. No entanto, existem algumas adições que são

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

Referências:

PS: o utilitário isort classifica automaticamente suas importações.

Abhishek
fonte
21
Não vejo onde você está respondendo a pergunta real ...
liori 24/12/2013
3
Enviei uma referência / links relevantes informando como classificar os módulos. Como o PEP 8 não menciona nada, outras referências sugerem o uso de métodos de importação como este.
precisa
7
Observe que a pergunta é sobre classificação import xe from y import zdeclarações relativas uma à outra. Não vejo resposta para esta pergunta na sua resposta. Você está basicamente reafirmando parte da pergunta que já explica a maneira de agrupar o PEP8 por tipo de importação. Se uma resposta a esta pergunta específica estiver em alguns dos links, cite as partes relevantes.
Liori 24/12/2013
2
Gostaria de observar uma opinião divergente sobre a afirmação de que as instruções de importação classificadas em ordem alfabética são mais fáceis de ler. Eu os acho muito mais difíceis de ler em comparação com as instruções de importação classificadas por tamanho. Se você classificasse lexicamente dentro de um determinado grupo de tamanhos, seria bom e pode até ser benéfico. Mas, eu acharia import datetimeseguido por import os muito mais difícil de ler do que import osseguido por import datetime. E a diferença de procurá-los, dada a classificação lexical versus a não lexicamente classificada, é tão trivial que não importa completamente, mesmo que de maneira leve.
Ely
Que ordem deve ser usada para importações privadas versus públicas? ( import _tkintervs import unittest)
Stevoisiak
30

De acordo com as convenções de codificação internas da CIA (parte do vazamento do WikiLeaks Vault 7 ), as importações de python devem ser agrupadas em três grupos:

  1. Importações de biblioteca padrão
  2. Importações de terceiros
  3. Importações específicas do aplicativo

As importações devem ser encomendadas lexicograficamente dentro desses grupos, ignorando o caso:

import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar
gar
fonte
23
Promovido pelo fator riso que são as diretrizes de estilo de codificação da CIA. Muito inteligente, mas ao mesmo tempo relevante, dado o nível de experiência desses desenvolvedores.
Tyler James Harden
5
que da Verbatim google guia de estilo python
Marius Mucenicu
1
Mas não segue do exemplo se from x import ydeve ser antes ou depois from y import x- é o nome do módulo ou a importação real que determina a ordem?
26519 Niklas R.
1
Eu sei que é uma piada, mas como um nerd de verdade, quero ressaltar que isso realmente vem do PEP8
Marat
8

O PEP 8 não diz nada sobre isso de fato. Não há convenção para esse ponto, e isso não significa que a comunidade Python precise defini-la absolutamente. Uma escolha pode ser melhor para um projeto, mas a pior para outro ... É uma questão de preferências para isso, pois cada solução tem prós e contras. Mas se você deseja seguir as convenções, deve respeitar a ordem principal que citou:

  1. importações de biblioteca padrão
  2. importações de terceiros relacionadas
  3. importações locais específicas de aplicativos / bibliotecas

Por exemplo, o Google recomenda nesta página que a importação seja classificada lexicograficamente , em cada categoria (padrão / terceiros / sua). Mas no Facebook, Yahoo e o que for, talvez seja outra convenção ...

Maxime Lorant
fonte
0

Todas as import xinstruções devem ser classificadas pelo valor de xe todas as from x import yinstruções devem ser classificadas pelo valor de xem ordem alfabética e os grupos de from x import yinstruções classificados devem seguir o grupo de import xinstruções classificado .

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

Eu sinto que a resposta aceita é um pouco detalhada demais. Aqui está o TLDR:

Dentro de cada agrupamento, as importações devem ser classificadas lexicograficamente, ignorando o caso, de acordo com o caminho completo do pacote de cada módulo

Guia de estilo de código do Google

Portanto, a terceira opção está correta:

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