วิธีที่ถูกต้องในการจัดเรียง Python `import x` และ` จาก x import y` statement คืออะไร?


170

คู่มือสไตล์หลามแนะนำให้การนำเข้ากลุ่มเช่นนี้

การนำเข้าควรจัดกลุ่มตามลำดับต่อไปนี้:

  1. การนำเข้าไลบรารีมาตรฐาน
  2. การนำเข้าของบุคคลที่สามที่เกี่ยวข้อง
  3. การนำเข้าเฉพาะแอปพลิเคชัน / ไลบรารีเฉพาะที่

อย่างไรก็ตามไม่ได้พูดถึงสิ่งที่ควรนำมาใช้ในการกำหนดวิธีการนำเข้าสองวิธี:

from foo import bar
import foo

มีหลายวิธีในการจัดเรียง (สมมติว่าการนำเข้าทั้งหมดอยู่ในกลุ่มเดียวกัน):

  • ก่อนfrom..importอื่นimport

    from g import gg
    from x import xx
    import abc
    import def
    import x
    
  • ก่อนimportอื่นfrom..import

    import abc
    import def
    import x
    from g import gg
    from x import xx
    
  • เรียงตามตัวอักษรตามชื่อโมดูลโดยไม่สนใจชนิดของการนำเข้า

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

PEP8 ไม่ได้กล่าวถึงลำดับที่ต้องการสำหรับฟีเจอร์นี้และฟีเจอร์ "การนำเข้าการล้างข้อมูล" บาง IDEs อาจทำตามที่นักพัฒนาของฟีเจอร์นั้นต้องการ

ฉันกำลังมองหา PEP อื่นที่ให้ความกระจ่างหรือแสดงความคิดเห็น / อีเมลที่เกี่ยวข้องจากBDFL (หรือนักพัฒนาหลัก Python อื่น) โปรดอย่าโพสต์คำตอบส่วนตัวที่ระบุความต้องการของคุณเอง


20
ถึงผู้ใช้ที่ลงคะแนนให้ปิด: ฉันไม่ได้ขอความคิดเห็น! โปรดอ่านคำถามสุดท้ายของฉัน
ThiefMaster

9
ฉันสงสัยว่ามีวิธี "ถูกต้อง" มีอะไรผิดปกติกับการเลือกสไตล์ของคุณเองในเรื่องนี้? อาจไม่มีการประชุมหากไม่มีใครรู้ และมันมีความสำคัญจริง ๆ ? อะไรคือข้อดีของการระบุสิ่งนี้?
Steven Rumbalski

6
ควรขยายเสียง +1 เช่น PEP8
hochl

7
จุดอ่อนใน PEP ไม่ได้แปลว่าจำเป็นต้องแก้ไข
Ignacio Vazquez-Abrams

2
ฉันมักจะแบ่งการนำเข้าเป็นกลุ่มตรรกะแล้วเรียงลำดับกลุ่มเล็ก ๆ เหล่านี้ตามความยาวบรรทัด ... ด้วยเหตุผลง่ายๆที่พวกเขาดูดีกว่า หากคุณใส่กลุ่มตรรกะเหล่านี้ตามลำดับอย่างใดคุณก็สามารถค้นหาการนำเข้าได้ค่อนข้างเร็ว (นอกเหนือจากCtrl+Fเวลาคงที่ไม่ว่าคุณจะจัดการการนำเข้าอย่างไร ... )
Bakuriu

คำตอบ:


112

โดยทั่วไปแล้วการนำเข้าจะถูกจัดเรียงตามตัวอักษรและอธิบายไว้ในสถานที่ต่างๆนอกเหนือจาก PEP 8

ตามลำดับตัวอักษรเรียงโมดูลจะเร็วจะอ่านและค้นหา หลังจากหลามทั้งหมดนั้นเกี่ยวกับความสามารถในการอ่าน นอกจากนี้ยังง่ายต่อการตรวจสอบว่ามีบางสิ่งที่นำเข้าและหลีกเลี่ยงการนำเข้าที่ซ้ำกัน

ไม่มีอะไรใน PEP 8 เกี่ยวกับการเรียงลำดับดังนั้นทั้งหมดเกี่ยวกับการเลือกสิ่งที่คุณใช้

อ้างอิงถึงการอ้างอิงน้อยจากเว็บไซต์ที่มีชื่อเสียงและที่เก็บยังความนิยมการเรียงลำดับตัวอักษรเป็นวิธี

สำหรับเช่นนี้

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

หรือ

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

พื้นที่เก็บข้อมูล Reddit อย่างเป็นทางการยังระบุว่าควรใช้การสั่งซื้อการนำเข้า PEP-8 โดยทั่วไป อย่างไรก็ตามมีบางส่วนเพิ่มเติมซึ่งก็คือ

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

อ้างอิง:

PS: ยูทิลิตี isortจะเรียงลำดับการนำเข้าของคุณโดยอัตโนมัติ


21
ฉันไม่เห็นตำแหน่งที่คุณตอบคำถามจริง…
liori

3
@liori ฉันส่งลิงค์อ้างอิง / ที่เกี่ยวข้องซึ่งระบุถึงวิธีการเรียงลำดับโมดูล เนื่องจาก PEP 8 ไม่ได้พูดถึงอะไรเลย แต่มีการอ้างอิงอีกมากมายที่แนะนำให้ใช้วิธีการนำเข้าเช่นนี้
Abhishek

7
โปรดทราบว่าคำถามนั้นเกี่ยวกับการเรียงลำดับimport xและfrom y import zคำสั่งที่สัมพันธ์กัน ฉันไม่เห็นคำตอบสำหรับคำถามนี้ในคำตอบของคุณ คุณได้กล่าวถึงบางส่วนของคำถามที่อธิบายวิธีการจัดกลุ่มตามประเภทการนำเข้าของ PEP8 แล้ว หากคำตอบสำหรับคำถามนี้อยู่ในลิงค์บางส่วนกรุณาอ้างอิงส่วนที่เกี่ยวข้อง
liori

2
ฉันต้องการบันทึกมุมมองที่ไม่เห็นด้วยกับการอ้างสิทธิ์ว่าคำสั่งการนำเข้าที่เรียงตามตัวอักษรนั้นอ่านง่ายขึ้น ฉันพบว่าพวกเขาอ่านยากกว่ามากเมื่อเทียบกับข้อความสั่งการนำเข้าที่เรียงตามความยาว หากคุณเรียงลำดับศัพท์ภายในกลุ่มความยาวที่กำหนดนั่นอาจเป็นเรื่องปกติและอาจเป็นประโยชน์ แต่ฉันจะพบimport datetimeตามด้วยimport os มากยากที่จะอ่านกว่าตามมาด้วยimport os import datetimeและความแตกต่างในการค้นหาคำศัพท์เหล่านั้นที่ได้จากการเรียงลำดับคำศัพท์และการเรียงลำดับคำศัพท์ไม่ได้เป็นเรื่องเล็กน้อยดังนั้นไม่ว่าจะเป็นเรื่องเล็ก ๆ น้อย ๆ ก็ตาม
ely

คำสั่งใดที่ควรใช้สำหรับการนำเข้าส่วนตัวกับสาธารณะ ( import _tkintervs import unittest)
Stevoisiak

30

ตามอนุสัญญาการเข้ารหัสภายในของ CIA (ส่วนหนึ่งของการรั่วไหลของWikiLeaks Vault 7 ) การนำเข้าหลามควรถูกจัดกลุ่มเป็นสามกลุ่ม:

  1. การนำเข้าไลบรารีมาตรฐาน
  2. การนำเข้าของบุคคลที่สาม
  3. การนำเข้าเฉพาะแอปพลิเคชัน

ควรสั่งการนำเข้าพจนานุกรมภายในกลุ่มเหล่านี้โดยไม่สนใจขนาดตัวพิมพ์:

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

23
เพิ่มขึ้นสำหรับปัจจัยหัวเราะที่เป็นแนวทางการเข้ารหัสของ CIA ฉลาดมาก แต่ในขณะเดียวกันก็มีความเกี่ยวข้องเนื่องจากระดับของความเชี่ยวชาญที่มาจากนักพัฒนาเหล่านั้น
Tyler James Harden


2
การเชื่อมโยง Updated: คู่มือสไตล์ Google หลาม - มาตรา 3.13: Imports การจัดรูปแบบ
Mateen Ulhaq

1
แต่จะไม่ปฏิบัติตามจากตัวอย่างหากfrom x import yควรเป็นก่อนหรือหลังfrom y import x- เป็นชื่อของโมดูลหรือการนำเข้าจริงซึ่งกำหนดคำสั่งซื้อหรือไม่
Niklas R.

1
ฉันรู้ว่ามันเป็นเรื่องตลก แต่เป็นคนโง่ที่เหมาะสมฉันต้องการชี้ให้เห็นว่านี่มาจาก PEP8 จริง ๆ
Marat

8

PEP 8 ไม่ได้พูดถึงเรื่องนี้ ไม่มีข้อตกลงสำหรับจุดนี้และมันไม่ได้หมายความว่าชุมชน Python จำเป็นต้องกำหนดหนึ่งอย่างแน่นอน ตัวเลือกอาจดีกว่าสำหรับโครงการ แต่ที่แย่ที่สุดสำหรับอีก ... มันเป็นคำถามของการตั้งค่าสำหรับเรื่องนี้เนื่องจากแต่ละโซลูชั่นมีข้อดีและข้อเสีย แต่ถ้าคุณต้องการทำตามอนุสัญญาคุณต้องเคารพคำสั่งที่คุณอ้างถึง:

  1. การนำเข้าไลบรารีมาตรฐาน
  2. การนำเข้าของบุคคลที่สามที่เกี่ยวข้อง
  3. การนำเข้าเฉพาะแอปพลิเคชัน / ไลบรารีเฉพาะที่

ตัวอย่างเช่นGoogle แนะนำในหน้านี้ที่นำเข้าควรเรียงตามพจนานุกรมในแต่ละหมวดหมู่ (มาตรฐาน / บุคคลที่สาม / ของคุณ) แต่ที่ Facebook, Yahoo และอะไรก็ตามมันอาจจะเป็นการประชุมอื่น ...



0

import xคำสั่งทั้งหมดควรถูกจัดเรียงตามค่าของxและfrom x import yคำสั่งทั้งหมดควรเรียงตามค่าของxเรียงตามตัวอักษรและกลุ่มที่เรียงลำดับของfrom x import yคำสั่งจะต้องเป็นไปตามกลุ่มที่เรียงลำดับของimport xคำสั่ง

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

0

ฉันรู้สึกว่าคำตอบที่ได้รับการยอมรับนั้นค่อนข้างละเอียดเกินไป นี่คือ TLDR:

ภายในแต่ละการจัดกลุ่มการนำเข้าควรเรียงตามพจนานุกรมโดยไม่สนใจขนาดตัวพิมพ์ตามเส้นทางแพกเกจแบบเต็มของแต่ละโมดูล

คู่มือสไตล์รหัส Google

ดังนั้นตัวเลือกที่สามนั้นถูกต้อง:

import abc
import def
from g import yy  # changed gg->yy for illustrative purposes
import x
from xx import xx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.