Nhập chuẩn mã hóa đơn hàng


84

PEP8 gợi ý rằng:

Hàng nhập khẩu phải được nhóm theo thứ tự sau:

  1. nhập thư viện tiêu chuẩn
  2. nhập khẩu của bên thứ ba liên quan
  3. nhập ứng dụng / thư viện cục bộ cụ thể

Bạn nên đặt một dòng trống giữa mỗi nhóm nhập khẩu.

Có cách nào để kiểm tra xem chuẩn bị vi phạm bất cứ nơi nào trong gói sử dụng công cụ phân tích mã tĩnh, như pylint, pyflakes, pychecker, pep8?


Ví dụ về vi phạm:

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

Cách nhập đúng:

import os

from django.db import models

from my_package import my_module

1
Công pep8cụ hiện không kiểm tra điều này - nó chỉ kiểm tra nhiều lần nhập trên một dòng (E401)
DNA

@DNA tốt để biết, cảm ơn bạn. Hy vọng có một cái gì đó ra khỏi đó.
alecxe

PyCharm có thể làm điều này nhưng tôi không chắc chắn 100%. Tuy nhiên, nó tốn tiền.
Claudiu

5
@Claudiu - Pycharm cũng có phiên bản cộng đồng.
Amit Verma,

3
Nếu bạn không tìm thấy thứ gì đó, bạn có thể viết plugin pylint của riêng mình để kiểm tra điều này cho bạn. Hãy xem pylint-plugin-utils và một plugin mẫu tại đây . (Điều này có thể phù hợp hơn như một bình luận nhưng tôi không có danh tiếng để nhận xét.)
mobeets

Câu trả lời:


70

Phiên bản hiện tại của pylint hiện thực hiện điều này và báo cáo nó là lớp lỗi C0411.


9
Đây sẽ là một câu trả lời được bình chọn cao hơn bây giờ. Đối với các phiên bản gần đây hơn không hiển thị số lỗi nữa, đó là lớp lỗi wrong-import-order.
Soren Bjornstad

54

Cập nhật (2016): sbywater có câu trả lời gần đây nhất.


Tìm thấy rồi! (vô tình, khi đang đọc "Hướng dẫn của hacker về python")

Dự án OpenStack Hacking Style Checks có tên là hack giới thiệu một số flake8tiện ích mở rộng độc đáo . Có hacking_import_groups trong số đó ( cam kết liên quan ).

Thí dụ:

  • yêu cầu

    • độc tố
    • vảy8
    • hacking (từ nhánh chính):

      $ git clone https://github.com/openstack-dev/hacking.git
      $ cd hacking/
      $ python setup.py install
      
  • tệp được sử dụng trong ví dụ

    • tox.ini (chúng tôi cần nói với flake8 rằng chúng tôi muốn sử dụng kiểm tra tùy chỉnh)

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

      UPD: với phiên bản mới nhất của hackingđường dẫn đến séc đã thay đổi, bây giờ là như vậy hacking.checks.imports.hacking_import_groups.

    • test.py (mục tiêu của séc)

      import requests
      import sys
      from my_module import print_smth
      
      
      print_smth(requests.get('https://google.com'))
      print_smth(sys.version)
      
    • my_module.py(nhập khẩu địa phương được sử dụng bởi test.py)

      def print_smth(smth):
          print smth
      

Sau đó, nếu tôi flake8chống lại 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)

Sau đó, nếu tôi nhóm các mục nhập theo đúng thứ tự sau PEP8:

import sys

import requests

from my_module import print_smth


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

Không tìm thấy cảnh báo:

$ flake8 test.py
$

Hy vọng điều này sẽ giúp ai đó trong tương lai.


1
Bạn nên trao tiền thưởng cho chính mình :-). Rất vui khi tìm thấy btw, tôi có thể tự bắt đầu sử dụng cái này
Tim

2
Họ lấy ra kiểm tra này, với lý do rằng đó là quá dễ bị lỗi và khó khăn: github.com/openstack-dev/hacking/commit/...
jobevers

@jobevers cảm ơn bạn đã cập nhật! Vâng, tôi đã sử dụng nó mà không có bất kỳ vấn đề :)
alecxe

26

Hãy xem tại https://pypi.python.org/pypi/isort hoặc https://github.com/timothycrosley/isort

isort phân tích cú pháp các tệp được chỉ định cho các dòng nhập cấp toàn cầu (nhập bên ngoài khối try / exceptions, các hàm, v.v.) và đặt tất cả chúng ở đầu tệp được nhóm lại với nhau theo kiểu nhập:

  • Tương lai
  • Thư viện chuẩn Python
  • Bên thứ ba
  • Dự án Python hiện tại
  • Rõ ràng cục bộ (. Trước khi nhập, như trong: từ. Nhập x)

Các phần riêng biệt tùy chỉnh (Được xác định bởi danh sáchced_separate trong tệp cấu hình) Bên trong mỗi phần, các mục nhập được sắp xếp theo thứ tự bảng chữ cái. isort tự động loại bỏ các lần nhập python trùng lặp và kết thúc dài từ các lần nhập đến độ dài dòng được chỉ định (mặc định là 80).

https://pypi.python.org/pypi/flake8-isort cắm chức năng này vào flake8


2
Chỉ cần lưu ý rằng nếu bạn chạy isort script_name.py --check-only- nó sẽ chỉ kiểm tra các lần nhập chưa được sắp xếp và in ra kết quả - đây là những gì tôi cần. Cảm ơn bạn rất nhiều cho tùy chọn.
alecxe

isort -rc --check --diffkiểm tra tất cả các tệp một cách đệ quy, chỉ kiểm tra, hiển thị một sự khác biệt
ptim

7

Có một flake8plugin: flake8-import-order .

Gói này thêm 3 cảnh báo flake8 mới

I100: Báo cáo nhập của bạn không đúng thứ tự.

I101: Tên trong từ nhập của bạn không đúng thứ tự.

I201: Thiếu dòng mới giữa các phần hoặc nhập.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.