Estándar de codificación de pedidos de importación

84

PEP8 sugiere que:

Las importaciones deben agruparse en el siguiente orden:

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

Debe poner una línea en blanco entre cada grupo de importaciones.

¿Hay una manera de comprobar si la norma se viola en cualquier parte del paquete utilizando herramientas de análisis de código estático, como pylint, pyflakes, pychecker, pep8?


Ejemplo de infracción:

from my_package import my_module
from django.db import models
import os

Forma correcta de importar:

import os

from django.db import models

from my_package import my_module
Alecxe
fuente
1
La pep8herramienta no verifica esto actualmente, solo verifica múltiples importaciones en una línea (E401)
DNA
@DNA es bueno saberlo, gracias. Espero que haya algo ahí fuera.
Alecxe
PyCharm podría hacer esto, pero no estoy 100% seguro. Sin embargo, cuesta dinero.
Claudiu
5
@Claudiu - Pycharm también tiene una versión comunitaria.
Amit Verma
3
Si no encuentra algo, puede escribir su propio plugin pylint para comprobarlo por usted. Eche un vistazo a pylint-plugin-utils y un complemento de ejemplo aquí . (Esto podría ser más adecuado como comentario, pero no tengo la reputación de comentar)
mobeets

Respuestas:

70

La versión actual de pylint ahora hace esto y lo informa como clase de error C0411.

sbywater
fuente
9
Esta debería ser una respuesta más votada ahora. Para versiones más recientes que ya no muestran los números de error, es la clase de error wrong-import-order.
Soren Bjornstad
54

Actualización (2016): sbywater tiene la respuesta más reciente.


¡Lo encontré! (accidentalmente, mientras leía "Guía de piratas informáticos sobre python")

El proyecto OpenStack Hacking Style Checks llamado hacking presenta varias flake8extensiones únicas . Entre ellos hay hacking_import_groups ( compromiso relacionado ).

Ejemplo:

  • requisitos

    • tox
    • escama8
    • piratería (de la rama maestra):

      $ git clone https://github.com/openstack-dev/hacking.git
      $ cd hacking/
      $ python setup.py install
      
  • archivos usados ​​en el ejemplo

    • tox.ini (necesitamos decirle a flake8 que queremos usar un cheque personalizado)

      [hacking]
      local-check = hacking.core.hacking_import_groups
      

      UPD: con la versión más reciente de hackingla ruta al cheque cambiada, ahora lo es hacking.checks.imports.hacking_import_groups.

    • test.py (objetivo del cheque)

      import requests
      import sys
      from my_module import print_smth
      
      
      print_smth(requests.get('https://google.com'))
      print_smth(sys.version)
      
    • my_module.py(importación local utilizada por test.py)

      def print_smth(smth):
          print smth
      

Entonces, si me enfrento flake8a test.py:

$ flake8 test.py
test.py:2:1: H305  imports not grouped correctly (requests: third-party, sys: stdlib)
test.py:3:1: H305  imports not grouped correctly (sys: stdlib, my_module.print_smth: project)
test.py:3:1: H306  imports not in alphabetical order (sys, my_module.print_smth)

Entonces, si agrupo las importaciones en el orden correcto siguiente PEP8:

import sys

import requests

from my_module import print_smth


print_smth(requests.get('https://google.com'))
print_smth(sys.version)

No se encontraron advertencias:

$ flake8 test.py
$

Espero que esto ayude a alguien en el futuro.

Alecxe
fuente
1
Deberías concederte la recompensa a ti mismo :-). Buen descubrimiento, por cierto, podría comenzar a usar esto yo mismo
Tim
2
Sacaron este cheque, citando que era demasiado propenso a errores y difícil: github.com/openstack-dev/hacking/commit/…
jobevers
@jobevers ¡gracias por la actualización! Bueno, lo he usado sin ningún problema :)
alecxe
26

Eche un vistazo a https://pypi.python.org/pypi/isort o https://github.com/timothycrosley/isort

isort analiza los archivos especificados para las líneas de importación de nivel global (importaciones fuera de los bloques try / excepts, funciones, etc.) y los coloca en la parte superior del archivo agrupados por el tipo de importación:

  • Futuro
  • Biblioteca estándar de Python
  • Tercero
  • Proyecto Python actual
  • Explícitamente local (. Antes de la importación, como en: desde. Importar x)

Secciones separadas personalizadas (definidas por la lista forzada_separada en el archivo de configuración) Dentro de cada sección, las importaciones están ordenadas alfabéticamente. isort elimina automáticamente las importaciones de Python duplicadas y se ajusta desde las importaciones hasta la longitud de línea especificada (el valor predeterminado es 80).

https://pypi.python.org/pypi/flake8-isort conecta esta funcionalidad en flake8

más inteligente
fuente
2
Solo tenga en cuenta que si ejecuta isort script_name.py --check-only, solo verificaría las importaciones sin clasificar e imprimirá los resultados, esto es lo que necesitaba. Muchas gracias por la opcion
alecxe
isort -rc --check --diffcomprobar todos los archivos de forma recursiva, sólo comprobar, mostrar una diferencia
ptim
7

Existe un flake8complemento: flake8-import-order .

Este paquete agrega 3 nuevas advertencias flake8

I100: Sus declaraciones de importación están en el orden incorrecto.

I101: Los nombres de su importación están en el orden incorrecto.

I201: Falta una nueva línea entre secciones o importaciones.

fénix
fuente