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

7 minutos de lectura

avatar de usuario
ladrónmaestro

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

Las importaciones deben agruparse en el siguiente orden:

  1. importaciones de biblioteca estándar
  2. importaciones relacionadas de terceros
  3. importaciones específicas de bibliotecas/aplicaciones locales

Sin embargo, no menciona nada sobre cómo se deben establecer las dos formas diferentes de importación:

from foo import bar
import foo

Hay varias formas de ordenarlos (supongamos que todos los importados pertenecen al mismo grupo):

  • primero from..importdespués import

    from g import gg
    from x import xx
    import abc
    import def
    import x
    
  • primero importdespués from..import

    import abc
    import def
    import x
    from g import gg
    from x import xx
    
  • orden alfabético por nombre de 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 funciones de “importaciones de limpieza” que algunos IDE probablemente solo hagan lo que prefiera el desarrollador de esa función.

Estoy buscando otro PEP que aclare esto o un comentario/correo electrónico relevante del BDFL (u otro desarrollador central de Python). Por favor, no publique respuestas subjetivas indicando su propia preferencia.

  • 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 la conoce. ¿Y realmente importa? ¿Cuál es la ventaja de tener esto especificado?

    –Steven Rumbalski

    24 de diciembre de 2013 a las 14:40


  • Consulte también este hilo relevante: Estándar de codificación de órdenes de importación.

    – alecxe

    11 de junio de 2014 a las 16:41


avatar de usuario
Abhishek

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. Además, es más fácil verificar que algo se importa y evita las importaciones duplicadas.

No hay nada disponible en PEP 8 con respecto a la clasificación. Así que se trata de elegir lo que usas.

De acuerdo con algunas referencias de sitios y repositorios de buena reputación, también de 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 usar el pedido de importación PEP-8. Sin embargo, hay algunas adiciones que son que para cada grupo importado el orden de las importaciones debe ser:

import <package>.<module> style lines in alphabetical order
from <package>.<module> import <symbol> style in alphabetical order

Referencias:

PD: el utilidad de clasificación ordena automáticamente sus importaciones.

  • No veo dónde estás respondiendo la pregunta real…

    – liori

    24 de diciembre de 2013 a las 19:10


  • @liori Envié una referencia/enlaces relevantes que indican cómo ordenar los módulos. Como PEP 8 no menciona nada, pero muchas otras referencias sugieren usar métodos de importación como este.

    – Abhishek

    24 de diciembre de 2013 a las 19:26


  • Tenga en cuenta que la pregunta es sobre la clasificación import x y from y import z declaraciones relativas entre sí. No veo respuesta a esta pregunta en su respuesta. Básicamente, está reafirmando 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 algunos de los enlaces, cite las partes relevantes.

    – liori

    24 de diciembre de 2013 a las 20:14

  • ¿Qué orden se debe utilizar para las importaciones privadas frente a las públicas? (import _tkinter contra import unittest)

    – Stevoisiak

    25 de mayo de 2018 a las 15:19


De acuerdo con las convenciones internas de codificación de la CIA (parte del Filtración de la Bóveda 7 de WikiLeaks), las importaciones de python deben agruparse en tres grupos:

  1. Importaciones de biblioteca 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 mayúsculas y minúsculas:

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

  • Votó a favor por el factor de risa que son las pautas de estilo de codificación de la CIA. Muy inteligente, pero al mismo tiempo relevante dado el nivel de experiencia de esos desarrolladores.

    – Tyler Durden

    18/10/2017 a las 21:59

  • eso es textual guía de estilo de google python

    – Marius Mucenicu

    14 de abril de 2018 a las 8:39

  • Enlace actualizado: Guía de estilo de Python de Google – Sección 3.13: formato de importaciones.

    –Mateen Ulhaq

    3 de mayo de 2019 a las 1:06


  • Pero no se sigue del ejemplo si from x import y debe ser antes o despues from y import x – ¿Es el nombre del módulo o la importación real lo que determina el pedido?

    – Niklas Rosencrantz

    26 de agosto de 2019 a las 7:20

  • Sé que es una broma, pero como un verdadero nerd, quiero señalar que esto en realidad proviene de PEP8.

    – Marat

    15 de junio de 2020 a las 21:04

avatar de usuario
Maxime Lorant

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

  1. importaciones de biblioteca estándar
  2. importaciones relacionadas de terceros
  3. importaciones específicas de bibliotecas/aplicaciones locales

Por ejemplo, Google recomienda en esta página que la importación debe ordenarse lexicográficamente, en cada una de las categorías (estándar/de terceros/suya). Pero en Facebook, Yahoo y lo que sea, tal vez sea otra convención…

  • Para responder a la pregunta de forma más directa, las guías de estilo de Google recomiendan ordenar por ruta, que es la tercera opción de la pregunta: “orden alfabético por nombre de módulo, ignorando el tipo de importación”.

    – Jezzamón

    26 de febrero de 2021 a las 1:31

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

Dentro de cada grupo, las importaciones deben ordenarse 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

te lo recomiendo mucho reordenar-python-importaciones. Sigue la segunda opción de la respuesta aceptada y también se integra en pre cometidoque es muy útil.

  • yo recomiendo isort. Desafortunadamente reorder-python-imports trata cualquier enlace simbólico como un tercero.

    – correr_la_carrera

    28 de junio a las 18:29

avatar de usuario
Astitva Srivastava

Todos import x Las sentencias deben ordenarse por el valor de x y todo from x import y Las sentencias deben ordenarse por el valor de x en orden alfabético y los grupos ordenados de from x import y declaraciones deben seguir el grupo ordenado de import x declaraciones.

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

  • yo recomiendo isort. Desafortunadamente reorder-python-imports trata cualquier enlace simbólico como un tercero.

    – correr_la_carrera

    28 de junio a las 18:29

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad