มีรูปแบบที่แนะนำสำหรับการนำเข้าหลายบรรทัดหรือไม่


114

ฉันได้อ่านแล้วมีสามวิธีในการเข้ารหัสการนำเข้าแบบหลายบรรทัดใน python

ด้วยเครื่องหมายทับ:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
    LEFT, DISABLED, NORMAL, RIDGE, END

การทำสำเนา senteces:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text
from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END

ด้วยวงเล็บ:

from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
    LEFT, DISABLED, NORMAL, RIDGE, END)

มีรูปแบบที่แนะนำหรือวิธีที่หรูหรากว่าสำหรับข้อความนี้หรือไม่?


3
ด้วยการนำเข้าจำนวนมากทำไมไม่เพียงfrom Tkinter import *?
Inbar Rose

2
นี่คือตัวอย่าง คำสั่งจริงคือfrom data.forms import AddressEmbeddedField, PhoneEmbeddedField, MailEmbeddedField, \ WebEmbeddedFieldแต่ไม่ต้องการนำเข้าส่วนที่เหลือทั้งหมดของฟิลด์ที่ฝังอยู่ใน data.forms
Manuel Alvarez

19
หลายเหตุผล. เช่นคุณอาจเขียนทับตัวแปรหลายตัวที่คุณไม่ทราบ คุณรู้จักชื่อทั้งหมดที่นำเข้าโดยfrom Tkinter import *? ฉันไม่. และ IDE จะไม่ทราบว่าชื่อเหล่านี้ (อาจ) จึงไม่สามารถบอกได้ว่าคุณป้อนชื่อที่ไม่ถูกต้องหรือไม่
Thorsten Kranz

2
@InbarRose เป็นแฮบบิทที่ไม่ดีดูที่stackoverflow.com/questions/3615125/…
Yuval Pruss

คำตอบ:


161

โดยส่วนตัวแล้วฉันใช้วงเล็บเมื่อนำเข้าส่วนประกอบมากกว่าหนึ่งรายการและเรียงลำดับตามตัวอักษร ชอบมาก:

from Tkinter import (
    Button,
    Canvas,
    DISABLED,
    END,
    Entry,
    Frame,
    LEFT,
    NORMAL,
    RIDGE,
    Text,
    Tk,
)

สิ่งนี้มีข้อได้เปรียบเพิ่มเติมในการดูได้อย่างง่ายดายว่ามีการเพิ่ม / ลบส่วนประกอบใดในแต่ละคอมมิตหรือ PR

โดยรวมแล้วแม้ว่าจะเป็นความชอบส่วนตัวและฉันขอแนะนำให้คุณเลือกสิ่งที่ดีที่สุดสำหรับคุณ


3
ฉันคิดว่าสิ่งสำคัญคือต้องมีความสม่ำเสมอ (อย่างน้อยก็ภายในโครงการที่กำหนด) ซึ่งจะช่วยให้ผู้อ่านโค้ดสามารถค้นหาสิ่งที่นำเข้าได้โดยไม่ยากเกินไป
Blckknght

1
สามารถใช้ isort เพื่อจัดรูปแบบการนำเข้าแบบหลายบรรทัดโดยอัตโนมัติในรูปแบบต่างๆได้ที่github.com/timothycrosley/isort#multi-line-output-modes
Motin

16

ตัวอย่างของคุณดูเหมือนจะเกิดจากPEP 328 ที่นั่นมีการเสนอเครื่องหมายวงเล็บสำหรับปัญหานี้ทั้งหมดดังนั้นฉันอาจเลือกอันนี้


4

ฉันจะใช้เครื่องหมายวงเล็บจากPEP328พร้อมกับขึ้นบรรทัดใหม่ก่อนและหลังวงเล็บ:

from Tkinter import (
    Tk, Frame, Button, Entry, Canvas, Text, 
    LEFT, DISABLED, NORMAL, RIDGE, END
)

นี่คือรูปแบบที่Djangoใช้:

from django.test.client import Client, RequestFactory
from django.test.testcases import (
    LiveServerTestCase, SimpleTestCase, TestCase, TransactionTestCase,
    skipIfDBFeature, skipUnlessAnyDBFeature, skipUnlessDBFeature,
)
from django.test.utils import (
    ignore_warnings, modify_settings, override_settings,
    override_system_checks, tag,
)

ไม่มีการขึ้นบรรทัดใหม่หลัง / ก่อนวงเล็บใน PEP 328?
Gandalf Saxe

@GandalfSaxe PEP 328 เป็นเรื่องเกี่ยวกับความหมาย (การเพิ่มคุณลักษณะใหม่ให้กับภาษา) ไม่เกี่ยวกับการจัดรูปแบบ
Max Malysh

ฉันไม่ค่อยเข้าใจแล้ว คุณอ้าง PEP 328 ว่ามีวงเล็บสำหรับการนำเข้าหลายบรรทัด แต่ไม่มีเลย? "ฉันจะใช้เครื่องหมายวงเล็บจาก PEP328 ที่มีการเพิ่มบรรทัดใหม่ก่อนและหลังวงเล็บ:"
Gandalf Saxe

PEP 328 เพิ่มเครื่องหมายวงเล็บให้กับภาษา สัญกรณ์วงเล็บคือความสามารถที่จะนำเข้าหลาย ๆ from foo import (bar, baz)โมดูลเช่นนี้ PEP 328 ไม่พูดอะไรเกี่ยวกับการจัดรูปแบบ
Max Malysh

โอเคฉันเข้าใจแล้วว่าตอนนี้คุณหมายถึงอะไร :)
Gandalf Saxe

-4

โดยปกติแล้ว Tkinter สามารถใช้งานได้from Tkinter import *เนื่องจากโมดูลจะส่งออกเฉพาะชื่อที่เป็นวิดเจ็ตที่ชัดเจนเท่านั้น

PEP 8ไม่มีรายการอนุสัญญาใด ๆ สำหรับกรณีดังกล่าวดังนั้นฉันเดาว่าขึ้นอยู่กับคุณที่จะตัดสินใจว่าตัวเลือกใดดีที่สุด ทุกอย่างเกี่ยวกับความสามารถในการอ่านดังนั้นเลือกสิ่งที่ชัดเจนว่าคุณกำลังนำเข้าสิ่งต่างๆจากโมดูลเดียว

เนื่องจากชื่อทั้งหมดเหล่านี้มีอยู่ในขอบเขตของคุณโดยส่วนตัวแล้วฉันคิดว่าตัวเลือก 2 นั้นชัดเจนที่สุดเนื่องจากคุณสามารถดูชื่อที่นำเข้าได้ดีที่สุด จากนั้นคุณสามารถแยกออกได้มากขึ้นเพื่อจัดกลุ่มชื่อเหล่านั้นเข้าด้วยกันซึ่งเป็นของกันและกัน ในตัวอย่างของผมอาจจะใส่Tk, FrameและCanvasแยกเป็นกลุ่มพวกเขาวิดเจ็ตเข้าด้วยกันในขณะที่มีButtonและTextแยกพวกเขาเป็นชิ้นส่วนที่มีขนาดเล็กในมุมมอง


11
ไม่เป็นไรที่จะใช้จาก X import *
Tolo Palmer

1
@ToloPalmer โดยปกติแล้วจะเป็นจริง แต่สำหรับ Tkinter โดยทั่วไปแล้วจะไม่เป็นไรเนื่องจากคุณนำเข้าวิดเจ็ตเท่านั้น ก็ระบุไว้ว่าแม้กระทั่งวิธีในการอ้างอิงในห้องสมุด และหากคุณแสดงรายการการนำเข้าเป็นรายการแรกคุณควรปลอดภัยเป็นพิเศษจากความขัดแย้งใด ๆ
โผล่

1
สำหรับการอ้างอิงปัญหาที่เกิดขึ้นกับfrom X import *แพ็คเกจที่ใช้__all__อย่างถูกต้องคือตัววิเคราะห์โค้ดแบบคงที่pyflakesไม่สามารถตรวจพบชื่อที่ไม่ได้กำหนดได้หากมีimport *เนื่องจากต้องสันนิษฐานว่าชื่อที่ไม่ได้กำหนดอาจถูกนำเข้าโดยไฟล์*.
RubenLaguna
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.