¿Cuál es la forma correcta de ordenar las declaraciones `import x` y` from x import y` de Python?

170

La guía de estilo de Python sugiere agrupar las importaciones de esta manera:

Las importaciones deben agruparse en el siguiente orden:

  1. importaciones de bibliotecas estándar
  2. importaciones de terceros relacionadas
  3. importación local de aplicaciones / bibliotecas específicas

Sin embargo, no menciona nada sobre cómo deberían establecerse las dos formas diferentes de importación:

from foo import bar
import foo

Hay varias formas de ordenarlos (supongamos que todas esas importaciones pertenecen al mismo grupo):

  • primero from..import, luegoimport

    from g import gg
    from x import xx
    import abc
    import def
    import x
  • primero import, luegofrom..import

    import abc
    import def
    import x
    from g import gg
    from x import xx
  • orden alfabético por nombre del módulo, ignorando el tipo de importación

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

PEP8 no menciona el orden preferido para esto y las características de "importación de limpieza" que algunos IDE probablemente solo hayan hecho lo que prefiera el desarrollador de esa característica.

Estoy buscando otro PEP que aclare esto o un comentario / correo electrónico relevante del BDFL (u otro desarrollador principal de Python). No publique respuestas subjetivas que indiquen su propia preferencia.

ThiefMaster
fuente
20
Para el usuario que votó para cerrar esto: ¡ no estoy pidiendo opiniones! Por favor lea el último párrafo de mi pregunta.
ThiefMaster
9
Dudo que haya una forma "correcta". ¿Qué hay de malo en elegir tu propio estilo en esto? Difícilmente puede haber una convención si nadie lo sabe. ¿Y realmente importa? ¿Cuál es la ventaja de tener esto especificado?
Steven Rumbalski
66
+1 suena como PEP8 debe extenderse.
hochl
77
Una debilidad en una PEP no significa necesariamente que deba modificarse.
Ignacio Vazquez-Abrams
2
Por lo general, divido las importaciones en grupos lógicos y luego clasifico estos grupos pequeños por longitud de línea ... por la sencilla razón de que se ven mejor. Si coloca estos grupos lógicos en un orden lógico de alguna manera, entonces puede buscar cualquier importación bastante rápido (además Ctrl+Fes tiempo constante sin importar la forma de organizar las importaciones ...)
Bakuriu

Respuestas:

112

Las importaciones generalmente se ordenan alfabéticamente y se describen en varios lugares además de PEP 8.

Los módulos ordenados alfabéticamente son más rápidos de leer y buscar . Después de todo, Python tiene que ver con la legibilidad. También es más fácil verificar que algo se importa y evita importaciones duplicadas

No hay nada disponible en PEP 8 con respecto a la clasificación, por lo que se trata de elegir qué usar.

Según algunas referencias de sitios y repositorios de buena reputación y popularidad, el orden alfabético es el camino.

por ejemplo, así:

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

El repositorio oficial de Reddit también establece que, en general, se debe utilizar el pedido de importación PEP-8. Sin embargo, hay algunas adiciones que es

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

Referencias

PD: la utilidad isort ordena automáticamente tus importaciones.

Abhishek
fuente
21
No veo dónde está respondiendo la pregunta real ...
liori
3
@liori Envié una referencia / enlaces relevantes que indicaban cómo ordenar los módulos. Como PEP 8 no menciona nada, pero muchas otras referencias sugieren utilizar métodos de importación como este.
Abhishek
77
Tenga en cuenta que la pregunta es sobre la clasificación import xy las from y import zdeclaraciones entre sí. No veo respuesta a esta pregunta en tu respuesta. Básicamente, está replanteando parte de la pregunta que ya explica la forma PEP8 de agrupar por tipo de importación. Si hay una respuesta a esta pregunta específica en alguno de los enlaces, cite las partes relevantes.
liori
2
Me gustaría señalar una opinión disidente sobre la afirmación de que las declaraciones de importación ordenadas alfabéticamente son más fáciles de leer. Los encuentro mucho más difíciles de leer en comparación con las declaraciones de importación ordenadas por longitud. Si ordenó léxicamente dentro de un grupo de longitud dado, eso estaría bien e incluso podría ser beneficioso. Pero, me parece import datetimeseguido por import os mucho más difícil de leer que import osseguido import datetime. Y la diferencia en la búsqueda de ellos dada la clasificación léxica frente a la clasificación no léxica es tan trivial que no importa por completo, incluso de una manera leve.
ely
¿Qué orden se debe utilizar para las importaciones privadas vs públicas? ( import _tkintervs import unittest)
Stevoisiak
30

De acuerdo con las convenciones de codificación internas de la CIA (parte de la filtración de WikiLeaks Vault 7 ), las importaciones de Python deben agruparse en tres grupos:

  1. Importaciones de bibliotecas estándar
  2. Importaciones de terceros
  3. Importaciones específicas de la aplicación

Las importaciones deben ordenarse lexicográficamente dentro de estos grupos, ignorando el caso:

import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar
gar
fuente
23
Votaron por el factor de risa de que son las directrices de estilo de codificación de la CIA. Muy inteligente, pero al mismo tiempo relevante dado el nivel de experiencia de esos desarrolladores.
Tyler James Harden
55
eso es literalmente la guía de estilo de google python
Marius Mucenicu
1
Pero no se desprende del ejemplo si from x import ydebería ser antes o después from y import x: ¿es el nombre del módulo o la importación real lo que determina el orden?
Niklas R.
1
Sé que es una broma, pero como un nerd apropiado, quiero señalar que esto en realidad proviene de PEP8
Marat
8

El PEP 8 no dice nada al respecto. No existe una convención para este punto, y no significa que la comunidad de Python necesite definir una absolutamente. Una elección puede ser mejor para un proyecto, pero lo peor para otro ... Es una cuestión de preferencias para esto, ya que cada solución tiene ventajas y desventajas. Pero si desea seguir las convenciones, debe respetar la orden principal que citó:

  1. importaciones de bibliotecas estándar
  2. importaciones de terceros relacionadas
  3. importación local de aplicaciones / bibliotecas específicas

Por ejemplo, Google recomienda en esta página que la importación se clasifique lexicográficamente , en cada categoría (estándar / terceros / la suya). Pero en Facebook, Yahoo y lo que sea, tal vez sea otra convención ...

Maxime Lorant
fuente
0

Todas las import xdeclaraciones deben estar ordenadas por el valor de xy todas las from x import ydeclaraciones deben estar ordenadas por el valor de xen orden alfabético y los grupos ordenados de from x import ydeclaraciones deben seguir el grupo ordenado de import xdeclaraciones.

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

Siento que la respuesta aceptada es demasiado detallada. Aquí está TLDR:

Dentro de cada grupo, las importaciones deben clasificarse lexicográficamente, ignorando mayúsculas y minúsculas, de acuerdo con la ruta completa del paquete de cada módulo

Guía de estilo de código de Google

Entonces, la tercera opción es correcta:

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