Có định dạng được đề xuất cho nhập nhiều dòng không?


114

Tôi đã đọc có ba cách để mã hóa nhập khẩu nhiều dòng trong python

Với dấu gạch chéo:

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

Nhân bản các mảnh:

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

Với dấu ngoặc đơn:

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

Có định dạng được đề xuất hoặc một cách thanh lịch hơn cho câu lệnh này không?


3
với rất nhiều nhập khẩu, tại sao không chỉ from Tkinter import *?
Inbar Rose

2
Đây là một ví dụ. Te tuyên bố thực sự là from data.forms import AddressEmbeddedField, PhoneEmbeddedField, MailEmbeddedField, \ WebEmbeddedFieldnhưng không muốn nhập khẩu tất cả các phần còn lại của lĩnh vực nhúng trong data.forms
Manuel Alvarez

19
Nhiều lý do. Ví dụ: bạn có thể ghi đè nhiều biến mà bạn không biết. Bạn có biết tất cả các tên được nhập bởi from Tkinter import *? Tôi không. Và IDE sẽ không biết nếu những tên này (có thể), do đó họ không thể biết liệu bạn có nhập một tên không hợp lệ hay không.
Thorsten Kranz

2
@InbarRose Đó là một habbit xấu, nhìn vào stackoverflow.com/questions/3615125/...
Yuval Pruss

Câu trả lời:


161

Cá nhân tôi sử dụng dấu ngoặc đơn khi nhập nhiều hơn một thành phần và sắp xếp chúng theo thứ tự bảng chữ cái. Như vậy:

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

Điều này có thêm lợi thế là dễ dàng nhìn thấy những thành phần nào đã được thêm / bớt trong mỗi cam kết hoặc PR.

Nhìn chung, mặc dù đó là sở thích cá nhân và tôi khuyên bạn nên chọn bất cứ thứ gì phù hợp nhất với bạn.


3
Tôi nghĩ điều quan trọng là phải nhất quán (ít nhất là trong một dự án nhất định). Điều đó sẽ giúp ai đó đọc mã dễ dàng tìm thấy những gì đang được nhập mà không gặp quá nhiều khó khăn.
Blckknght

1
isort có thể được sử dụng để tự động định dạng nhập khẩu nhiều dòng trong phong cách khác nhau, xem github.com/timothycrosley/isort#multi-line-output-modes
Motin

16

Các ví dụ của bạn dường như bắt nguồn từ PEP 328 . Ở đó, ký hiệu ngoặc đơn được đề xuất cho chính xác vấn đề này, vì vậy có lẽ tôi sẽ chọn cái này.


4

Tôi sẽ sử dụng ký hiệu dấu ngoặc từ PEP328 với các dòng mới được thêm vào trước và sau dấu ngoặc đơn:

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

Đây là định dạng mà Django sử dụng:

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,
)

Không có dòng mới nào được thêm vào sau / trước dấu ngoặc đơn trong PEP 328?
Gandalf Saxe

@GandalfSaxe PEP 328 là về ngữ nghĩa (thêm một tính năng mới vào ngôn ngữ), không phải về định dạng.
Max Malysh

Tôi không hiểu lắm. Bạn trích dẫn PEP 328 là có dấu ngoặc đơn cho nhập khẩu nhiều dòng, nhưng chúng không có? "Tôi sẽ sử dụng ký hiệu dấu ngoặc đơn từ PEP328 với các dòng mới được thêm vào trước và sau dấu ngoặc đơn:"
Gandalf Saxe

PEP 328 đã thêm ký hiệu dấu ngoặc vào ngôn ngữ. Ký hiệu ngoặc là khả năng nhập khẩu nhiều mô-đun như thế này: from foo import (bar, baz). PEP 328 không nói gì về định dạng.
Max Malysh

Ah ok, tôi thấy những gì bạn có nghĩa là bây giờ :)
Gandalf Saxe

-4

Thông thường với Tkinter, bạn chỉ cần sử dụng from Tkinter import *vì mô-đun sẽ chỉ xuất ra các tên widget rõ ràng là được.

PEP 8 không liệt kê bất kỳ quy ước nào cho trường hợp như vậy, vì vậy tôi đoán tùy bạn quyết định đâu là lựa chọn tốt nhất. Đó là tất cả về khả năng đọc, vì vậy hãy chọn bất kỳ điều gì làm rõ ràng rằng bạn đang nhập nội dung từ một mô-đun duy nhất.

Vì tất cả những tên đó đều có sẵn trong phạm vi của bạn, cá nhân tôi nghĩ rằng tùy chọn 2 là rõ ràng nhất vì bạn có thể thấy những tên đã nhập là tốt nhất. Sau đó, bạn thậm chí có thể tách nó ra nhiều hơn để có thể nhóm những tên đó lại với nhau. Trong ví dụ của bạn tôi có thể đặt Tk, FrameCanvasriêng biệt như nhóm họ widget với nhau, trong khi có ButtonTextriêng biệt như họ là những thành phần nhỏ hơn trong một cái nhìn.


11
Không bao giờ là OK để sử dụng từ X nhập khẩu *
Tolo Palmer

1
@ToloPalmer Thông thường điều đó đúng, nhưng đối với Tkinter, điều này nói chung là ổn, vì bạn chỉ nhập các widget; nó thậm chí được liệt kê theo cách đó trong tài liệu tham khảo thư viện . Và nếu bạn liệt kê nhập là lần đầu tiên, bạn sẽ đặc biệt an toàn trước mọi xung đột.
poke

1
Để tham khảo, vấn đề với from X import *ngay cả đối với các gói sử dụng __all__đúng cách là các trình phân tích mã tĩnh như pyflakeskhông thể phát hiện các tên không xác định nếu có import *vì nó phải giả định rằng bất kỳ tên không xác định nào có thể được nhập bởi *.
RubenLaguna
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.