standard nomenclatura name lineas largas functions coding python python-import static-analysis pep8

nomenclatura - python package name



Estándar de codificación de la orden de importación (4)

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

¡Lo encontré! (accidentalmente, mientras leía "Hacker''s guide to python")

Las comprobaciones de estilo de hacking OpenStack del proyecto denominado hacking introducen varias extensiones flake8 únicas. Hay hacking_import_groups entre ellos ( commit relacionado).

Ejemplo:

  • requisitos

    • tox
    • flake8
    • hacking (desde la rama principal):

      $ git clone https://github.com/openstack-dev/hacking.git $ cd hacking/ $ python setup.py install

  • archivos utilizados en el ejemplo

    • tox.ini (tenemos que 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 hacking , se cambió la ruta del cheque, ahora 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 ejecuto flake8 contra 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)

Luego, si PEP8 las importaciones en el orden correcto siguiendo a 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.

PEP8 sugiere que:

Las importaciones deben agruparse en el siguiente orden:

  1. importación de biblioteca estándar
  2. importaciones de terceros relacionadas
  3. aplicación local / importación específica de biblioteca

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

¿Hay alguna forma de comprobar si el estándar se infringe en cualquier parte del paquete utilizando herramientas de análisis de código estático, como pylint , pyflakes , pychecker , pep8 ?

Ejemplo de violació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


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

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

  • Futuro
  • Biblioteca estándar de Python
  • Tercero
  • Proyecto actual de Python
  • Explicitly Local (. Antes de la importación, como en: from. Import x)

Secciones separadas personalizadas (definidas por la lista forced_separate en el archivo de configuración) Dentro de cada sección, las importaciones se ordenan alfabéticamente. isort elimina automáticamente las importaciones duplicadas de python y se envuelve desde las importaciones a la longitud de línea especificada (por defecto es 80).

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


Existe flake8 complemento flake8 : flake8-import-order .

Este paquete agrega 3 nuevas advertencias de flake8

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

I101: los nombres en su importación desde están en el orden incorrecto.

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


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