Import standardu kodowania zamówień

84

PEP8 sugeruje, że:

Import należy pogrupować w następującej kolejności:

  1. standardowe importy bibliotek
  2. powiązany import stron trzecich
  3. import lokalnych aplikacji / bibliotek

Powinieneś umieścić pustą linię między każdą grupą importów.

Czy istnieje sposób, aby sprawdzić, czy norma jest naruszone w dowolnym miejscu na opakowaniu przy użyciu narzędzi analizy statycznej kodu, jak pylint, pyflakes, pychecker, pep8?


Przykład naruszenia:

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

Prawidłowy sposób importu:

import os

from django.db import models

from my_package import my_module
alecxe
źródło
1
pep8Narzędzie aktualnie nie to sprawdzić - to tylko kontrole dla wielu importu na jednej linii (E401)
DNA
@DNA Dobrze wiedzieć, dziękuję. Mam nadzieję, że coś tam jest.
alecxe
PyCharm może to zrobić, ale nie jestem w 100% pewien. To jednak kosztuje pieniądze.
Claudiu
5
@Claudiu - Pycharm ma również wersję społecznościową.
Amit Verma
3
Jeśli nie znajdziesz czegoś, możesz napisać własną wtyczkę pylint, aby to sprawdzić. Spójrz na pylint-plugin-utils i przykładową wtyczkę tutaj . (To może lepiej pasować jako komentarz, ale nie mam reputacji do komentowania.)
mobeets

Odpowiedzi:

70

Obecna wersja pylint teraz to robi i zgłasza to jako błąd klasy C0411.

sbywater
źródło
9
To powinna być teraz bardziej głosowana odpowiedź. W przypadku nowszych wersji, które nie wyświetlają już numerów błędów, jest to klasa błędu wrong-import-order.
Soren Bjornstad,
54

Aktualizacja (2016): sbywater ma najnowszą odpowiedź.


Znalazłem to! (przypadkowo podczas czytania „Hacker's guide to Python”)

Projekt OpenStack Hacking Style Checks o nazwie hacking wprowadza kilka unikalnych flake8rozszerzeń. Są wśród nich hacking_import_groups (powiązane zatwierdzenie ).

Przykład:

  • wymagania

    • toks
    • płatek 8
    • hakowanie (z głównej gałęzi):

      $ git clone https://github.com/openstack-dev/hacking.git
      $ cd hacking/
      $ python setup.py install
      
  • pliki użyte w przykładzie

    • tox.ini (musimy powiedzieć flake8, że chcemy użyć niestandardowego czeku)

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

      UPD: przy hackingzmianie najnowszej wersji ścieżki do czeku, teraz jest hacking.checks.imports.hacking_import_groups.

    • test.py (cel czeku)

      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 lokalny używany przez test.py)

      def print_smth(smth):
          print smth
      

Następnie, jeśli biegnę flake8przed 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)

Następnie, jeśli pogrupuję importy we właściwej kolejności PEP8:

import sys

import requests

from my_module import print_smth


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

Nie znaleziono ostrzeżeń:

$ flake8 test.py
$

Mam nadzieję, że to pomoże komuś w przyszłości.

alecxe
źródło
1
Powinieneś przyznać sobie nagrodę :-). Przy okazji niezłe znalezisko, mógłbym sam zacząć używać tego
Tim
2
Wyciągnęli
jobevers
@jobevers dzięki za aktualizację! Cóż, użyłem go bez żadnych problemów :)
alecxe
26

Zajrzyj na https://pypi.python.org/pypi/isort lub https://github.com/timothycrosley/isort

isort analizuje określone pliki dla linii importu na poziomie globalnym (importuje poza blokami try / excepts, funkcje itp.) i umieszcza je wszystkie na górze pliku pogrupowane razem według typu importu:

  • Przyszłość
  • Biblioteka standardowa języka Python
  • Strona trzecia
  • Bieżący projekt w Pythonie
  • Jawnie lokalnie (. Przed importem, jak w: from. Import x)

Niestandardowe oddzielne sekcje (zdefiniowane przez listę wymuszonych_separate w pliku konfiguracyjnym) Wewnątrz każdej sekcji importowane są sortowane alfabetycznie. isort automatycznie usuwa zduplikowane importy języka Python i zawija długość od importu do określonej długości linii (domyślnie 80).

https://pypi.python.org/pypi/flake8-isort podłącza tę funkcjonalność do flake8

cleder
źródło
2
Zwróć tylko uwagę, że jeśli uruchomisz isort script_name.py --check-only- sprawdziłby tylko nieposortowane importy i wydrukował wyniki - tego potrzebowałem. Bardzo dziękuję za możliwość skorzystania z opcji.
alecxe
isort -rc --check --diffsprawdzaj wszystkie pliki rekurencyjnie, tylko sprawdzając, wyświetl
różnicę
7

Istnieje flake8wtyczka: flake8-import-order .

Ten pakiet dodaje 3 nowe ostrzeżenia flake8

I100: Twoje instrukcje importu są w złej kolejności.

I101: Nazwy w pliku z importu są w złej kolejności.

I201: Brak nowej linii między sekcjami lub importami.

feniks
źródło