2010-09-01 14 views
30

Tôi đang sử dụng PyQt và đang chạy vào vấn đề này. Nếu các báo cáo nhập của tôi là:Có nên tránh nhập ký tự đại diện không?

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

thì pylint đưa ra hàng trăm cảnh báo "Nhập không sử dụng". Tôi do dự để chỉ tắt chúng đi, bởi vì có thể có các hàng nhập khẩu chưa sử dụng khác thực sự hữu ích để xem. Một tùy chọn khác là thực hiện việc này:

from PyQt4.QtCore import Qt, QPointF, QRectF 
from PyQt4.QtGui import QGraphicsItem, QGraphicsScene, ... 

và tôi kết thúc có 9 lớp học trên dòng QtGui. Có một lựa chọn thứ ba, đó là:

from PyQt4 import QtCore, QtGui 

và sau đó tiền tố tất cả các lớp học với QtCore hoặc QtGui bất cứ khi nào tôi sử dụng chúng.

Tại thời điểm này, tôi bất khả tri về việc tôi sẽ làm gì trong dự án của mình, mặc dù điều cuối cùng có vẻ khó khăn nhất từ ​​quan điểm của tôi. Các phương pháp phổ biến ở đây là gì? Có lý do kỹ thuật nào để sử dụng một phong cách khác không?

+0

tôi đóng vai chính câu hỏi này bởi vì tôi muốn nhìn thấy câu trả lời, nhưng tôi cũng rất tò mò là tại sao một sẽ làm cái này. Thông thường tôi chỉ nhập những gì tôi cần, và tôi biết những gì tôi cần, vì vậy tôi chỉ nhập những thứ đó. Có lẽ tôi đang ngây thơ, nhưng có vẻ như với tôi rằng "nỗi đau" khi gõ QtCore.something sẽ tốt hơn (tự động điền?) Hơn là lãng phí thời gian xử lý nhập hàng trăm mặt hàng không sử dụng. Tôi biết làm như vậy sẽ làm cho tôi bị thổi phồng trong một đánh giá mã. Họ hỏi tôi về mỗi lần nhập khẩu tôi sử dụng. – xnine

+0

Tôi đồng ý với bạn về mã chuyên nghiệp, nhưng đối với các kịch bản hoặc dự án cá nhân, nó không phải là vấn đề lớn. Đặc biệt là kể từ khi nhập khẩu có lẽ sẽ xảy ra ngay tại khởi động chương trình, do đó, nó không ảnh hưởng đến hiệu suất chạy, chỉ cần khởi động thời gian. – Colin

Trả lời

31

Câu trả lời cho tiêu đề của câu hỏi của bạn là "có": Tôi khuyên bạn nên không bao giờ sử dụng from ... import *, và tôi đã thảo luận về lý do tại một câu trả lời rất gần đây. Tóm lại, tên đủ điều kiện là tốt, tên mã rất hạn chế, do đó, "tùy chọn thứ ba" là tối ưu (vì bạn sẽ sử dụng tên đủ điều kiện, không phải tên bar) trong số những tên bạn hiện diện.

(Ưu điểm của tên đủ điều kiện tên lửa wrt bao gồm dễ giả mạo/chế nhạo cho mục đích thử nghiệm, giảm nguy cơ vô hiệu hóa lỗi không được chú ý gây ra bởi sự cố tình cờ, khả năng "bán giả" tên đứng đầu trong "lớp truy tìm" cho mục đích ghi lại chính xác những gì bạn đang sử dụng và giảm bớt các hoạt động như lược tả, vv - những bất lợi, chỉ là không có gì ... xem thêm phần cuối cùng nhưng không kém trong Zen của Python, import this tại dấu nhắc thông dịch tương tác).

Tương tự tốt, nếu bạn đay 7 nhân vật phụ để nói QtCore.whatever, là viết tắt - from PyQt4 import QtCore as Crfrom PyQt4 import QtGi as Gu (sau đó sử dụng Cr.blahGu.zorp) hoặc tương tự. Giống như tất cả các từ viết tắt, đó là một sự cân bằng về phong cách giữa sự rõ ràng và rõ ràng (bạn có muốn đặt một biến số count_of_all_widgets_in_the_inventory, num_widgets hoặc x? Thường là lựa chọn trung bình sẽ là tốt nhất, nhưng không phải lúc nào ;-).

BTW, tôi sẽ không sử dụng nhiều hơn một as điều khoản trong một đơn from hoặc import tuyên bố (có thể là khó hiểu), tôi muốn có nhiều câu lệnh (còn dễ dàng hơn để gỡ lỗi nếu có nhập khẩu được đưa ra vấn đề, để chỉnh sửa nếu bạn thay đổi nhập khẩu của bạn trong tương lai, ...).

+1

Cảm ơn, đó là một thông tin hữu ích rất nhiều – Colin

+0

Một ưu điểm khác của trình độ - bạn không thể nhập mọi thứ trong một thư viện khổng lồ như PyQt, và sau đó vô tình gây ra xung đột không gian tên với một thứ bạn không biết. – user106514

+1

có thể có lỗi đánh máy, "nhập từ này" -> "nhập này" – sunqiang

3

Python doc nói:

Although certain modules are designed to export only names that follow certain patterns when you use import *, it is still considered bad practise in production code.

Nó có thể có tác dụng phụ và rất khó khăn để gỡ lỗi

Personnaly, Tôi đang sử dụng import hơn from import vì tôi tìm thấy tờ khai lớn khủng khiếp vào đầu tệp và tôi cho rằng tệp giữ mã dễ đọc hơn

import PyQt4 

PyQt4.QtCore 

Nếu tên mô-đun quá dài và có thể được đổi tên cục bộ bằng từ khóa as. Ví dụ:

import PyQt4.QtCore as Qc 

Tôi hy vọng nó giúp

+0

Vì vậy, nếu bạn có trình xử lý sự kiện chuột, ví dụ: bạn có thể có một dòng như sau: "if event.buttons() & PyQt4.QtCore.Qt.LeftButton:"? Điều đó không có vẻ là có thể đọc được như "nếu event.buttons() & Qt.LeftButton:" – Colin

+3

Nếu nó được quá lâu tôi làm: nhập khẩu PyQt4.QtCore.Qt tại Qc và sau đó Qc.LeftButton – luc

+0

Tôi có nghĩa là: nhập khẩu PyQt4. QtCore.Qt như Qc – luc

6

Ngoài ra còn có các trường hợp tốt cho import *. I E. nó phổ biến cho các nhà phát triển Django có nhiều file config và chuỗi chúng sử dụng nhập khẩu *:

settings.py: 
FOO = 1 
BAR = 2 
DEBUG = False 

test_settings.py: 
from settings import * 
DEBUG = True 

Trong trường hợp này hầu hết các nhược điểm của import * trở thành lợi thế.

+0

Các tệp như vậy là một kỳ quan được thiết kế để được nhập theo sao. PyQt4.QtGui không đủ điều kiện! C-; – Phlip

+4

@Phlip Đồng ý, nhưng tiêu đề của bài đăng này là "Nên nhập ký tự đại diện có nên tránh không?" không nên "Tránh nhập ký tự đại diện ** trong PyQt4 **?" –

+0

Tôi nghĩ rằng câu trả lời này là cần thiết trong việc hiển thị các tình huống tốt, không chỉ chọn kịch bản chính và nói rằng nó xấu. Nó giống như nói rằng "Tôi có nên lái xe của tôi trên một con đường", và ai đó nói "có" và người khác nói "không nếu có" không có dấu hiệu "nhập cảnh". – James

0

nhập cho PyQt4 là trường hợp đặc biệt.
đôi khi tôi sẽ chọn "tùy chọn đầu tiên" để mã hóa nhanh chóng và dơ bẩn và chuyển nó thành "tùy chọn thứ hai" khi mã phát triển lâu hơn và lâu hơn.
va chạm không gian tên có thể không phải là một vấn đề lớn ở đây, tôi đã không nhìn thấy package'name khác bắt đầu với một "Q" lớn. và bất cứ khi nào tôi hoàn thành kịch bản PyQt4. chuyển đổi "từ PyQt4.QtGui import *" thành sth. như "

from PyQt4.QtGui import (QApplication, QDialog, QLineEdit, QTextBrowser, 
         QVBoxLayout) 

" chỉ FYI, parentheses for multi-line import là tiện dụng ở đây.

1

Tôi sử dụng "import *" cho các mô-đun PyQt tôi sử dụng, nhưng tôi đặt chúng trong mô-đun riêng của chúng, vì vậy nó không gây ô nhiễm không gian tên của người dùng. ví dụ.

Trong qt4.py:

 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

Sau đó sử dụng nó như thế này

 
import qt4 
app = qt4.QApplication(...) 
+1

Điều này không tương đương với "nhập PyQt4.QtCore như qt4 "? Tôi đoán bạn sẽ cần không gian tên riêng biệt cho QtCore và QtGui nếu bạn đã làm điều đó, nhưng điều đó dường như không phải là một điều xấu. – Colin

+0

Nó tương đương, nếu chỉ có một nhập khẩu trong qt4.py.I ' đã không tìm thấy sự khác biệt giữa QtCore, QtGui, vv ... rất hữu ích khi lập trình – xioxox

+0

Đây là một giải pháp tốt đẹp mà được xung quanh tàu tuần dương ở phía trên cùng của các tập tin nguồn.Các mô-đun Qt không xung đột với nhau, vì vậy điều này giới thiệu không có vấn đề như xa như tôi có thể nói. – mfitzp