Importare lo standard di codifica dell'ordine


84

PEP8 suggerisce che:

Le importazioni dovrebbero essere raggruppate nel seguente ordine:

  1. importazioni di librerie standard
  2. importazioni di terze parti correlate
  3. importazioni specifiche dell'applicazione / libreria locale

È necessario inserire una riga vuota tra ogni gruppo di importazioni.

C'è un modo per verificare se la norma viene violata in qualsiasi parte del pacchetto usando strumenti di analisi statica del codice, come pylint, pyflakes, pychecker, pep8?


Esempio di violazione:

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

Modo corretto per importare:

import os

from django.db import models

from my_package import my_module

1
Lo pep8strumento attualmente non lo verifica - controlla solo le importazioni multiple su una riga (E401)
DNA

@ DNA buono a sapersi, grazie. Spero che ci sia qualcosa là fuori.
alecxe

PyCharm potrebbe farlo ma non ne sono sicuro al 100%. Però costa soldi.
Claudiu

5
@Claudiu - Pycharm ha anche una versione community.
Amit Verma

3
Se non trovi qualcosa, potresti scrivere il tuo plugin pylint per verificarlo per te. Dai un'occhiata a pylint-plugin-utils e un plugin di esempio qui . (Questo potrebbe essere più adatto come commento ma non ho la reputazione di commentare.)
mobeets

Risposte:


70

La versione corrente di pylint ora lo fa e lo segnala come classe di errore C0411.


9
Questa dovrebbe essere una risposta con un voto più alto ora. Per le versioni più recenti che non visualizzano più i numeri di errore, è la classe di errore wrong-import-order.
Soren Bjornstad

54

Aggiornamento (2016): sbywater ha la risposta più recente.


Trovato! (accidentalmente, durante la lettura di "Hacker guide to Python")

Progetto OpenStack Hacking Style Checks denominato hacking introduce diverse flake8estensioni uniche . Tra questi ci sono hacking_import_groups (relative commit ).

Esempio:

  • requisiti

    • tox
    • fiocco 8
    • hacking (dal ramo master):

      $ git clone https://github.com/openstack-dev/hacking.git
      $ cd hacking/
      $ python setup.py install
      
  • file utilizzati nell'esempio

    • tox.ini (dobbiamo dire a flake8 che vogliamo usare un controllo personalizzato)

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

      UPD: con la versione più recente di hacking percorso per il controllo modificato, ora lo è hacking.checks.imports.hacking_import_groups.

    • test.py (obiettivo del controllo)

      import requests
      import sys
      from my_module import print_smth
      
      
      print_smth(requests.get('https://google.com'))
      print_smth(sys.version)
      
    • my_module.py(importazione locale utilizzata da test.py)

      def print_smth(smth):
          print smth
      

Quindi, se corro flake8controtest.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)

Quindi, se raggruppo le importazioni nell'ordine corretto di seguito PEP8 :

import sys

import requests

from my_module import print_smth


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

Nessun avviso trovato:

$ flake8 test.py
$

Spero che questo possa aiutare qualcuno in futuro.


1
Dovresti assegnare la taglia a te stesso :-). Bella scoperta, potrei iniziare a usarlo da solo
Tim

2
Hanno
ritirato

@jobevers grazie per l'aggiornamento! Bene, l'ho usato senza problemi :)
alecxe

26

Dai un'occhiata a https://pypi.python.org/pypi/isort o https://github.com/timothycrosley/isort

isort analizza i file specificati per le righe di importazione a livello globale (importazioni al di fuori di blocchi try / trannes, funzioni, ecc.) e li mette tutti all'inizio del file raggruppati insieme per tipo di importazione:

  • Futuro
  • Libreria standard Python
  • Terzo
  • Progetto Python attuale
  • Esplicitamente locale (. Prima dell'importazione, come in: from. Import x)

Sezioni separate personalizzate (definite dalla lista forced_separate nel file di configurazione) All'interno di ogni sezione le importazioni sono ordinate alfabeticamente. isort rimuove automaticamente le importazioni duplicate di Python e racchiude il long dalle importazioni alla lunghezza di riga specificata (il valore predefinito è 80).

https://pypi.python.org/pypi/flake8-isort inserisce questa funzionalità in flake8


2
Tieni presente che se esegui isort script_name.py --check-only- controllerebbe solo le importazioni non ordinate e stamperebbe i risultati - questo è ciò di cui avevo bisogno. Grazie mille per l'opzione.
alecxe

isort -rc --check --diffcontrolla tutti i file in modo ricorsivo, solo controllando, mostra un diff
ptim

7

flake8Esiste un plugin: flake8-import-order .

Questo pacchetto aggiunge 3 nuovi avvisi flake8

I100: Le tue dichiarazioni di importazione sono nell'ordine sbagliato.

I101: I nomi nel tuo from import sono nell'ordine sbagliato.

I201: nuova riga mancante tra sezioni o importazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.