2010-09-01 9 views
30

मैं पीईक्यूटी का उपयोग कर रहा हूं और इस मुद्दे में भाग रहा हूं। यदि मेरे आयात विवरण हैं:क्या वाइल्डकार्ड आयात से बचा जाना चाहिए?

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

तब पिलिंट सैकड़ों "अप्रयुक्त आयात" चेतावनियां देता है। मैं उन्हें बंद करने में संकोच कर रहा हूं, क्योंकि अन्य अप्रयुक्त आयात हो सकते हैं जो वास्तव में देखने के लिए उपयोगी हैं। एक अन्य विकल्प यह करना होगा:

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

और मैं QtGui लाइन पर 9 कक्षाएं समाप्त करता हूं।

from PyQt4 import QtCore, QtGui 

और फिर QtCore या QtGui के साथ सभी वर्ग उपसर्ग जब भी मैं उन्हें इस्तेमाल: वहाँ एक तीसरा विकल्प है, जो है।

इस बिंदु पर मैं अज्ञात हूं कि मैं अपनी परियोजना में क्या कर रहा हूं, हालांकि आखिरी व्यक्ति मेरे परिप्रेक्ष्य से सबसे दर्दनाक लगता है। यहां सामान्य प्रथाएं क्या हैं? क्या एक शैली का उपयोग दूसरे पर करने के लिए तकनीकी कारण है?

+0

मैं इस सवाल का अभिनय किया है क्योंकि मैं इस सवाल का जवाब देखना चाहता हूँ की तरह उपयोग, लेकिन मैं क्यों एक होगा के रूप में भी उत्सुक हूँ यह करो। आम तौर पर मैं केवल वही आयात करता हूं जो मुझे चाहिए, और मुझे पता है कि मुझे क्या चाहिए, इसलिए मैं केवल उन चीजों को आयात करता हूं। हो सकता है कि मैं बेवकूफ़ बन रहा हूं, लेकिन मुझे लगता है कि QtCore.something टाइपिंग का "दर्द" सैकड़ों अप्रयुक्त वस्तुओं को आयात करने वाले प्रोसेसर समय को बर्बाद करने से बेहतर होगा (ऑटोफिल?)। मुझे पता है कि ऐसा करने से मुझे कोड समीक्षा में विस्फोट हो जाएगा। वे मुझे उपयोग किए जाने वाले प्रत्येक आयात के बारे में मुझसे पूछते हैं। – xnine

+0

मैं पेशेवर कोड के लिए आपसे सहमत हूं, लेकिन निजी स्क्रिप्ट या परियोजनाओं के लिए, यह एक बड़ी समस्या नहीं है। खासकर जब से आयात प्रोग्राम लॉन्च पर होने वाला है, इसलिए इसे चलने वाले प्रदर्शन को प्रभावित नहीं करना चाहिए, बस स्टार्टअप समय। – Colin

उत्तर

31

अपने प्रश्न के शीर्षक का जवाब "हाँ" है: मैंने कभी नहीं from ... import * का उपयोग करना चाहिये, और मैं एक और बहुत हाल जवाब में कारणों पर चर्चा की। संक्षेप में, योग्य नाम अच्छा हैं, बैरेनम्स बहुत सीमित हैं, इसलिए आपके द्वारा प्रस्तुत किए गए "तीसरे विकल्प" इष्टतम हैं (जैसा कि आप योग्य नामों का उपयोग करेंगे, ब्रेनमार्क नहीं)।

(योग्य नामों के लाभ wrt barenames में परीक्षण प्रयोजनों के लिए नकली/नकली करने में आसानी शामिल है, आकस्मिक पुनर्वितरण से प्रेरित अनजान त्रुटियों के निरर्थक जोखिम में कमी, "अर्ध-नकली" की क्षमता "ट्रेसिंग क्लास" में शीर्ष नाम " आप जिस चीज का उपयोग कर रहे हैं और प्रोफाइलिंग के रूप में ऐसी गतिविधियों को आसानी से लॉगिंग करने का उद्देश्य, और इसके बारे में कुछ भी नहीं - नुकसान के बारे में, केवल किसी के बारे में नहीं ... पाइथन के जेन में import this पर अंतिम-लेकिन-कम-से-कम कोन भी देखें इंटरैक्टिव दुभाषिया संकेत)।

समान रूप से अच्छा, अगर आप 7 अतिरिक्त वर्ण शिकायत QtCore.whatever कहने के लिए, संक्षिप्त करने के लिए है - from PyQt4 import QtCore as Cr और from PyQt4 import QtGi as Gu (तब Cr.blah और Gu.zorp का उपयोग करें) या की तरह। सभी संक्षेपों की तरह, यह एकता और स्पष्टता के बीच एक स्टाइल ट्रेडऑफ है (क्या आप एक वैरिएबल count_of_all_widgets_in_the_inventory, num_widgets, या x नाम देंगे? अक्सर मध्यम पसंद सबसे अच्छा होगा, लेकिन हमेशा नहीं ;-)।

Btw, मैं एक से अधिक as खंड एक भी from या import बयान में आसान है, तो किसी भी आयात समस्या दे रहा है, अगर संपादित करने के लिए डिबग करने के लिए प्रयोग नहीं करेंगे (भ्रामक हो सकता है), मैं नहीं बल्कि कई बयानों होगा (यह भी आप भविष्य में अपने आयात बदलते हैं, ...)।

+1

के रूप में QtCore.Qt धन्यवाद, यह बहुत उपयोगी जानकारी है – Colin

+0

योग्यता का एक अन्य लाभ - आप पीईक्यूटी जैसे विशाल lib में सबकुछ आयात नहीं कर सकते हैं, और उसके बाद गलती से नामस्थान टक्कर का कारण बनते हैं जिसे आप नहीं जानते थे। – user106514

+1

शायद एक टाइपो है, "इस से आयात करें" -> "इसे आयात करें" – sunqiang

3

Python doc का कहना है:

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.

यह दुष्प्रभाव हो और क्योंकि मैं की शुरुआत में भयंकर बड़ा घोषणाओं को खोजने

Personnaly डिबग करने के लिए, मैं import बजाय from import उपयोग कर रहा हूँ बहुत मुश्किल हो सकता फ़ाइल और मुझे लगता है कि यह कोड को और अधिक पठनीय

import PyQt4 

PyQt4.QtCore 

यदि मॉड्यूल का नाम बहुत लंबा है और as कीवर्ड के साथ स्थानीय रूप से इसका नाम बदला जा सकता है। उदाहरण के लिए:

import PyQt4.QtCore as Qc 

मुझे आशा है कि यह मदद करता है

+0

तो यदि आपके पास माउस इवेंट हैंडलर था, उदाहरण के लिए, आपके पास इस तरह की एक पंक्ति हो सकती है: "अगर event.buttons() और PyQt4.QtCore.Qt.LeftButton:"? ऐसा लगता है कि "अगर event.buttons() और Qt.LeftButton:" – Colin

+3

यदि यह बहुत लंबा हो जाता है तो मैं करता हूं: QQ पर PyQt4.QtCore.Qt आयात करें और फिर Qc.LeftButton – luc

+0

मेरा मतलब था: आयात PyQt4। क्यूसी – luc

6

import * के लिए भी अच्छे मामले हैं। अर्थात।

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

test_settings.py: 
from settings import * 
DEBUG = True 

इस मामले में import * के सबसे नुकसान फायदे बन: Django डेवलपर्स कई config फ़ाइलें और उन्हें आयात * का उपयोग कर श्रृंखला के लिए यह आम बात है।

+0

ऐसी फाइलें एक-हिट-चमत्कार हैं जिन्हें स्टार द्वारा आयात करने के लिए डिज़ाइन किया गया है। PyQt4.QtGui योग्य नहीं है! सी-; – Phlip

+4

@ फिलिप सहमत हैं, लेकिन इस पोस्ट का शीर्षक "क्या वाइल्डकार्ड आयात से बचा जाना चाहिए?" नहीं "क्या PyQt4 ** में वाइल्डकार्ड आयात से बचा जाना चाहिए **?" –

+0

मुझे लगता है कि इस परिदृश्य को मुख्य परिदृश्य चुनने और यह बुरा कहने के लिए अच्छे परिदृश्य दिखाने में आवश्यक है। यह कहने जैसा है "क्या मुझे अपनी कार सड़क पर ले जाना चाहिए", और कोई कहता है "हां" और कोई और कहता है "अगर कोई प्रविष्टि नहीं है तो संकेत नहीं है"। – James

0

PyQt4 के लिए आयात एक विशेष मामला है।
कभी-कभी मैं त्वरित और गंदे कोडिंग के लिए "पहला विकल्प" चुनूंगा, और जब कोड लंबा और लंबा हो जाए तो इसे "दूसरा विकल्प" पर बदल देगा।
नेमस्पेस टक्कर शायद यहां एक बड़ा सौदा नहीं है, मुझे नहीं लगता कि अन्य पैकेज 'नाम एक बड़े "क्यू" के साथ शुरू होता है। और जब भी मैं एक PyQt4 स्क्रिप्ट खत्म करता हूं। "PyQt4.QtGui आयात * से" sth में कनवर्ट करें। की तरह "

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

" बस FYI करें, parentheses for multi-line import काम यहाँ है।

1

मैं अपने द्वारा उपयोग किए जाने वाले पीईक्यूटी मॉड्यूल के लिए "आयात *" का उपयोग करता हूं, लेकिन मैंने उन्हें अपने मॉड्यूल में रखा है, इसलिए यह उपयोगकर्ता के नामस्थान को प्रदूषित नहीं करता है। जैसे

qt4.py में:

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

फिर इस

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

यह "आयात PyQt4 के बराबर नहीं है।Qt4 के रूप में QtCore "? मुझे लगता है कि आपको QtCore और QtGui के लिए अलग-अलग नामस्थानों की आवश्यकता होगी यदि आपने ऐसा किया है, लेकिन यह ऐसी बुरी चीज की तरह प्रतीत नहीं होता है। – Colin

+0

यह समकक्ष है, अगर qt4.py में केवल एक ही आयात है I ' QtCore, QtGui, आदि के बीच भेद नहीं मिला ... प्रोग्रामिंग के दौरान बहुत उपयोगी है। – xioxox

+0

यह एक अच्छा समाधान है जो स्रोत फ़ाइलों के शीर्ष पर क्रुफ़्ट के आसपास आता है। क्यूटी मॉड्यूल एक दूसरे के साथ संघर्ष नहीं करते हैं, इसलिए यह जहां तक ​​मैं कह सकता हूं कोई समस्या नहीं पेश करता है। – mfitzp