web-dev-qa-db-fra.com

Norme de codage des commandes d'importation

PEP8 suggère que:

Les importations doivent être regroupées dans l'ordre suivant:

  1. importations de bibliothèque standard
  2. importations en provenance de tiers
  3. importations locales spécifiques à une application/bibliothèque

Vous devez mettre une ligne vide entre chaque groupe d'importations.

Existe-t-il un moyen de vérifier si la norme est violée n'importe où dans le package à l'aide d'outils d'analyse de code statique, tels que pylint, pyflakes, pychecker, pep8?


Exemple de violation:

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

Manière correcte d'importer:

import os

from Django.db import models

from my_package import my_module
77
alecxe

C'est ce que fait actuellement la version actuelle de pylint, qui est alors considérée comme une classe d'erreur C0411.

56
sbywater

Mise à jour (2016): sbywater a la réponse la plus récente.


Je l'ai trouvé! (accidentellement, en lisant "Le guide de Hacker sur Python")

Contrôles de style de piratage OpenStack projet nommé piratage introduit plusieurs uniques flake8 extensions. Il y a hacking_import_groups parmi eux (liés commit ).

Exemple:

  • exigences

    • tox
    • flake8
    • piratage (de la branche principale):

      $ git clone https://github.com/openstack-dev/hacking.git
      $ cd hacking/
      $ python setup.py install
      
  • fichiers utilisés dans l'exemple

    • tox.ini (nous devons dire à flake8 que nous voulons utiliser une vérification personnalisée)

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

      UPD: avec la dernière version de hacking le chemin de la vérification a changé, maintenant il s’agit de hacking.checks.imports.hacking_import_groups.

    • test.py (cible du chèque)

      import requests
      import sys
      from my_module import print_smth
      
      
      print_smth(requests.get('https://google.com'))
      print_smth(sys.version)
      
    • my_module.py _ (import local utilisé par test.py)

      def print_smth(smth):
          print smth
      

Ensuite, si je cours flake8 contre 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)

Ensuite, si je groupe les importations dans le bon ordre après PEP8:

import sys

import requests

from my_module import print_smth


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

Aucun avertissement trouvé:

$ flake8 test.py
$

J'espère que cela aidera quelqu'un à l'avenir.

54
alecxe

Regardez https://pypi.python.org/pypi/isort ou https://github.com/timothycrosley/isort

isort analyse les fichiers spécifiés pour les lignes d'importation de niveau global (importations en dehors de try/excepte des blocs, des fonctions, etc.) et les place tous en haut du fichier, regroupés par type d'importation:

  • Futur
  • Bibliothèque standard Python
  • Tierce personne
  • Projet actuel Python
  • Explicitement local (. Avant import, comme dans: from. Import x)

Sections séparées personnalisées (définies par la liste forcée_separate dans le fichier de configuration) À l'intérieur de chaque section, les importations sont triées par ordre alphabétique. isort supprime automatiquement les doublons python est importé et reste long depuis les importations jusqu'à la longueur de ligne spécifiée (la valeur par défaut est 80).

https://pypi.python.org/pypi/flake8-isort branche cette fonctionnalité dans flake8

25
cleder

UNE flake8 Le plugin existe: flake8-import-order .

Ce paquet ajoute 3 nouveaux avertissements flake8

I100: Vos déclarations d'importation sont dans le mauvais ordre.

I101: Les noms dans votre importation sont dans le mauvais ordre.

I201: saut de ligne manquant entre les sections ou les importations.

6
phoenix