Bestellcodierungsstandard importieren

84

PEP8 schlägt vor, dass:

Importe sollten in der folgenden Reihenfolge gruppiert werden:

  1. Standardbibliotheksimporte
  2. verwandte Importe von Dritten
  3. lokale anwendungs- / bibliotheksspezifische Importe

Sie sollten zwischen jeder Gruppe von Importen eine Leerzeile einfügen.

Gibt es eine Möglichkeit zu überprüfen , ob der Standard überall im Paket verletzt wird mit statischem Code - Analyse - Tool, wie pylint, pyflakes, pychecker, pep8?


Beispiel für einen Verstoß:

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

Richtige Art zu importieren:

import os

from django.db import models

from my_package import my_module
Alecxe
quelle
1
Das pep8Tool überprüft dies derzeit nicht - es prüft nur auf mehrere Importe in einer Zeile (E401)
DNA
@DNA gut zu wissen, danke. Hoffe da draußen ist etwas.
Alecxe
PyCharm könnte dies tun, aber ich bin nicht 100% sicher. Es kostet allerdings Geld.
Claudiu
5
@Claudiu - Pycharm hat auch eine Community-Version.
Amit Verma
3
Wenn Sie am Ende nichts finden, können Sie Ihr eigenes Pylint-Plugin schreiben, um dies für Sie zu überprüfen. Schauen Sie sich hier die Pylint-Plugin-Utils und ein Beispiel-Plugin an . (Dies könnte besser als Kommentar geeignet sein, aber ich habe nicht den Ruf zu kommentieren.)
Mobeets

Antworten:

70

Die aktuelle Version von pylint führt dies jetzt aus und meldet es als Fehlerklasse C0411.

sbywater
quelle
8
Dies sollte jetzt eine Antwort mit höherer Stimme sein. Bei neueren Versionen, in denen die Fehlernummern nicht mehr angezeigt werden, handelt es sich um die Fehlerklasse wrong-import-order.
Soren Bjornstad
54

Update (2016): sbywater hat die neueste Antwort.


Fand es! (versehentlich beim Lesen von "Hacker's Guide to Python")

Das OpenStack Hacking Style Checks- Projekt mit dem Namen Hacking führt mehrere einzigartige flake8Erweiterungen ein. Unter ihnen befinden sich hacking_import_groups (zugehöriges Commit ).

Beispiel:

  • Anforderungen

    • tox
    • flake8
    • Hacking (aus dem Master-Zweig):

      $ git clone https://github.com/openstack-dev/hacking.git
      $ cd hacking/
      $ python setup.py install
      
  • im Beispiel verwendete Dateien

    • tox.ini (Wir müssen flake8 mitteilen, dass wir einen benutzerdefinierten Check verwenden möchten.)

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

      UPD: Nachdem die neueste Version des hackingPfads zur Prüfung geändert wurde, ist dies jetzt der Fall hacking.checks.imports.hacking_import_groups.

    • test.py (Ziel des Schecks)

      import requests
      import sys
      from my_module import print_smth
      
      
      print_smth(requests.get('https://google.com'))
      print_smth(sys.version)
      
    • my_module.py(lokaler Import von test.py)

      def print_smth(smth):
          print smth
      

Wenn ich dann flake8gegen 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)

Wenn ich dann die Importe in der richtigen Reihenfolge gruppiere, folgt PEP8:

import sys

import requests

from my_module import print_smth


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

Keine Warnungen gefunden:

$ flake8 test.py
$

Hoffe das wird jemandem in Zukunft helfen.

Alecxe
quelle
1
Sie sollten das Kopfgeld an sich selbst vergeben :-). Netter Fund übrigens, ich könnte anfangen, dies selbst zu verwenden
Tim
2
Sie nahmen diese Prüfung heraus und führten an, dass sie zu fehleranfällig und schwierig sei: github.com/openstack-dev/hacking/commit/…
jobevers
@jobevers danke für das Update! Nun, ich habe es ohne Probleme verwendet :)
Alecxe
26

Besuchen Sie https://pypi.python.org/pypi/isort oder https://github.com/timothycrosley/isort

isort analysiert angegebene Dateien für Importzeilen auf globaler Ebene (Importe außerhalb von try / excepts-Blöcken, -Funktionen usw.) und setzt sie alle oben in die Datei, gruppiert nach dem Importtyp:

  • Zukunft
  • Python-Standardbibliothek
  • Dritte Seite
  • Aktuelles Python-Projekt
  • Explizit lokal (. Vor dem Import, wie in: from. Import x)

Benutzerdefinierte separate Abschnitte (definiert durch die Liste erzwungene Trennung in der Konfigurationsdatei) Innerhalb jedes Abschnitts werden die Importe alphabetisch sortiert. isort entfernt automatisch doppelte Python-Importe und schließt lange Importe mit der angegebenen Zeilenlänge ab (standardmäßig 80).

https://pypi.python.org/pypi/flake8-isort verbindet diese Funktionalität mit flake8

Cleder
quelle
2
Beachten Sie nur, dass ich beim Ausführen isort script_name.py --check-onlynur nach unsortierten Importen suchen und die Ergebnisse ausdrucken muss. Vielen Dank für die Option.
Alecxe
isort -rc --check --diffÜberprüfen Sie alle Dateien rekursiv, nur überprüfen Sie, zeigen Sie einen
Unterschied
7

Ein flake8Plugin existiert: flake8-import-order .

Dieses Paket enthält 3 neue Flake8-Warnungen

I100: Ihre Importanweisungen sind in der falschen Reihenfolge.

I101: Die Namen in Ihrem Import sind in der falschen Reihenfolge.

I201: Fehlende Zeilenumbrüche zwischen Abschnitten oder Importen.

Phönix
quelle