Cách chính xác để sắp xếp Python `import x` và` từ x import y` là gì?


170

Các hướng dẫn phong cách python gợi ý cho nhập khẩu nhóm như thế này:

Nhập khẩu nên được nhóm theo thứ tự sau:

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

Tuy nhiên, nó không đề cập bất cứ điều gì làm thế nào hai cách nhập khẩu khác nhau nên được đặt ra:

from foo import bar
import foo

Có nhiều cách để sắp xếp chúng (giả sử tất cả những lần nhập đó thuộc về cùng một nhóm):

  • đầu tiên from..import, sau đóimport

    from g import gg
    from x import xx
    import abc
    import def
    import x
  • đầu tiên import, sau đófrom..import

    import abc
    import def
    import x
    from g import gg
    from x import xx
  • thứ tự chữ cái theo tên mô-đun, bỏ qua các loại nhập khẩu

    import abc
    import def
    from g import gg
    import x
    from xx import xx

PEP8 không đề cập đến thứ tự ưu tiên cho việc này và các tính năng "nhập dọn dẹp" mà một số IDE có thể đã làm bất cứ điều gì mà nhà phát triển tính năng đó ưa thích.

Tôi đang tìm kiếm một PEP khác làm rõ điều này hoặc một nhận xét / email có liên quan từ BDFL (hoặc một nhà phát triển lõi Python khác). Xin đừng đăng câu trả lời chủ quan nêu rõ sở thích của bạn.


20
Đối với người dùng đã bỏ phiếu để đóng này: Tôi không hỏi ý kiến! Xin vui lòng đọc đoạn cuối của câu hỏi của tôi.
ThiefMaster

9
Tôi nghi ngờ có một cách "chính xác". Có gì sai khi chọn phong cách của riêng bạn về điều này? Khó có thể có một quy ước nếu không ai biết điều đó. Và nó có thật sự quan trọng không? Lợi thế của việc này được chỉ định là gì?
Steven Rumbalski

6
+1 âm thanh như PEP8 nên được mở rộng.
hochl

7
Một điểm yếu trong PEP không nhất thiết có nghĩa là nó cần sửa đổi.
Ignacio Vazquez-Abrams

2
Tôi thường chia nhập khẩu thành các nhóm logic và sau đó sắp xếp các nhóm nhỏ này theo độ dài dòng ... vì lý do đơn giản là chúng trông đẹp hơn. Nếu bạn đặt các nhóm logic này theo thứ tự hợp lý nào đó thì bạn có thể tìm kiếm mọi thao tác nhập khá nhanh (bên cạnh đó Ctrl+Flà thời gian không đổi cho dù bạn tổ chức nhập như thế nào ...)
Bakuriu

Câu trả lời:


112

Nhập khẩu thường được sắp xếp theo thứ tự abc và được mô tả ở những nơi khác nhau bên cạnh PEP 8.

Các mô-đun được sắp xếp theo thứ tự chữ cái nhanh hơn để đọc và tìm kiếm . Sau khi tất cả python là tất cả về khả năng đọc. Ngoài ra, dễ dàng hơn để xác minh rằng một cái gì đó được nhập khẩu và tránh nhập khẩu trùng lặp

PEP 8 không có gì liên quan đến việc sắp xếp. Vì vậy, tất cả là về sự lựa chọn những gì bạn sử dụng.

Theo một số tài liệu tham khảo từ các trang web có uy tín và kho lưu trữ cũng phổ biến, đặt hàng theo thứ tự chữ cái là cách.

ví dụ như thế này:

import httplib
import logging
import random
import StringIO
import time
import unittest
from nova.api import openstack
from nova.auth import users
from nova.endpoint import cloud

HOẶC LÀ

import a_standard
import b_standard

import a_third_party
import b_third_party

from a_soc import f
from a_soc import g
from b_soc import d

Kho lưu trữ chính thức của Reddit cũng nói rằng, nên sử dụng lệnh nhập PEP-8 nói chung. Tuy nhiên, có một vài bổ sung đó là

for each imported group the order of imports should be:
import <package>.<module> style lines in alphabetical order
from <package>.<module> import <symbol> style in alphabetical order

Người giới thiệu:

PS: tiện ích isort tự động sắp xếp hàng nhập của bạn.


21
Tôi không thấy bạn đang trả lời câu hỏi thực tế ở đâu
liori 24/12/13

3
@liori Tôi đã gửi một tài liệu tham khảo / liên kết có liên quan nêu cách sắp xếp các mô-đun. Vì PEP 8 không đề cập bất cứ điều gì nhưng nhiều tài liệu tham khảo khác đề nghị sử dụng các phương thức nhập như thế này.
Abhishek

7
Lưu ý rằng câu hỏi là về sắp xếp import xfrom y import zbáo cáo liên quan đến nhau. Tôi thấy không có câu trả lời cho câu hỏi này trong câu trả lời của bạn. Về cơ bản, bạn đang khôi phục một phần câu hỏi đã giải thích cách phân nhóm PEP8 theo loại nhập. Nếu một câu trả lời cho câu hỏi cụ thể này nằm trong một số liên kết, vui lòng trích dẫn các phần có liên quan.
liori

2
Tôi muốn lưu ý một quan điểm không đồng tình với tuyên bố rằng các câu lệnh nhập được sắp xếp theo thứ tự abc dễ đọc hơn. Tôi thấy chúng khó đọc hơn nhiều so với các câu lệnh nhập được sắp xếp theo độ dài. Nếu bạn sắp xếp từ vựng trong một nhóm độ dài nhất định, điều đó sẽ ổn và thậm chí có thể có lợi. Nhưng, tôi sẽ tìm thấy import datetimesau đó là import os nhiều khó khăn hơn để đọc hơn import ostiếp theo import datetime. Và sự khác biệt trong việc tìm kiếm chúng được sắp xếp từ vựng so với không sắp xếp từ vựng là rất nhỏ đến mức hoàn toàn không quan trọng ngay cả trong bất kỳ cách nào.
ely

Thứ tự nào nên được sử dụng cho tư nhân so với nhập khẩu công cộng? ( import _tkintervs import unittest)
Stevoisiak

30

Theo các công ước mã hóa nội bộ của CIA (một phần của vụ rò rỉ WikiLeaks Vault 7 ), nhập khẩu trăn nên được nhóm thành ba nhóm:

  1. Nhập thư viện chuẩn
  2. Nhập khẩu của bên thứ ba
  3. Nhập khẩu dành riêng cho ứng dụng

Nhập khẩu nên được đặt hàng từ vựng trong các nhóm này, bỏ qua trường hợp:

import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar

23
Được khuyến khích cho yếu tố gây cười rằng đó là hướng dẫn về phong cách mã hóa của CIA. Rất thông minh, nhưng đồng thời có liên quan với trình độ chuyên môn đến từ những nhà phát triển đó.
Tyler James Harden



1
Nhưng nó không tuân theo ví dụ nếu from x import ynên trước hay sau from y import x- đó là tên của mô-đun hoặc nhập thực tế xác định thứ tự?
Niklas R.

1
Tôi biết đó là một trò đùa, nhưng như một mọt sách thích hợp, tôi muốn chỉ ra rằng điều này thực sự đến từ PEP8
Marat

8

PEP 8 không nói gì về nó thực sự. Không có quy ước nào cho điểm này và điều đó không có nghĩa là cộng đồng Python cần xác định một cách tuyệt đối. Một lựa chọn có thể tốt hơn cho một dự án nhưng tồi tệ nhất cho một dự án khác ... Đó là một câu hỏi về sở thích cho việc này, vì mỗi giải pháp đều có ưu và nhược điểm. Nhưng nếu bạn muốn tuân theo các quy ước, bạn phải tôn trọng thứ tự chính mà bạn đã trích dẫn:

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

Ví dụ: Google khuyến nghị trong trang này rằng nhập nên được sắp xếp theo từ vựng , trong mỗi danh mục (tiêu chuẩn / bên thứ ba / của bạn). Nhưng tại Facebook, Yahoo và bất cứ điều gì, nó có thể là một quy ước khác ...



0

Tất cả các import xcâu lệnh nên được sắp xếp theo giá trị của xvà tất cả các from x import ycâu lệnh nên được sắp xếp theo giá trị xtheo thứ tự bảng chữ cái và các nhóm from x import ycâu lệnh được sắp xếp phải tuân theo nhóm import xcâu lệnh được sắp xếp .

import abc
import def
import x
from g import gg
from x import xx
from z import a

0

Tôi cảm thấy câu trả lời được chấp nhận là hơi quá dài dòng. Đây là TLDR:

Trong mỗi nhóm, nhập khẩu phải được sắp xếp theo từ vựng, trường hợp bỏ qua, theo đường dẫn gói đầy đủ của mỗi mô-đun

Hướng dẫn phong cách mã Google

Vì vậy, tùy chọn thứ ba là chính xác:

import abc
import def
from g import yy  # changed gg->yy for illustrative purposes
import x
from xx import xx
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.