2010-09-01 13 views
30

Sto usando PyQt e sto correndo in questo problema. Se le mie dichiarazioni di importazione sono:L'importazione di caratteri jolly dovrebbe essere evitata?

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

poi pylint dà centinaia di avvertimenti "di importazione non utilizzati". Sono riluttante a spegnerli, perché potrebbero esserci altre importazioni inutilizzate che sono effettivamente utili da vedere. Un'altra opzione potrebbe essere questa:

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

e alla fine ho 9 classi sulla linea QtGui. C'è una terza opzione, che è:

from PyQt4 import QtCore, QtGui 

e fare precedere tutte le classi con QtCore o QtGui ogni volta che li uso.

A questo punto sono agnostico su quale dei due finisco nel mio progetto, anche se l'ultimo sembra il più doloroso dal mio punto di vista. Quali sono le pratiche comuni qui? Ci sono ragioni tecniche per usare uno stile piuttosto che l'altro?

+0

ho recitato questa domanda perché voglio vedere la risposta, ma sono anche curioso di sapere perché si farebbe Fai questo. Di solito importa solo ciò di cui ho bisogno, e so di cosa ho bisogno, quindi importa solo quelle cose. Forse sono ingenuo, ma mi sembra che il "dolore" della digitazione di QtCore.something sia migliore (riempimento automatico?) Che sprecare tempo del processore per importare centinaia di oggetti inutilizzati. So che farlo mi farebbe saltare in una recensione del codice. Mi chiedono di ogni importazione che uso. – xnine

+0

Sono d'accordo con te per codice professionale, ma per script o progetti personali, non è un grosso problema. Soprattutto perché probabilmente l'importazione sta per accadere proprio all'avvio del programma, quindi non dovrebbe influire sulle prestazioni di esecuzione, ma solo sul tempo di avvio. – Colin

risposta

31

La risposta alla titolo della tua domanda è "sì": mi consiglia di non utilizzare from ... import *, e ho discusso le ragioni in un'altra risposta molto recente. In breve, i nomi qualificati sono buoni, i nomi dei bar sono molto limitati, quindi la "terza opzione" è ottimale (dato che userete nomi qualificati, non nomi a barre) tra quelli che presentate.

(I vantaggi dei nomi di battenti con nomi qualificati includono la facilità di simulare/falsificare a scopo di test, ridotto al rischio nullificato di errori non notificati indotti dalla riconciliazione accidentale, possibilità di "semi-falso" il nome top in una "classe di tracciamento" per lo scopo di registrare esattamente quello che stai usando e facilitare attività come la profilazione, e così via - svantaggi, quasi nessuno ... vedi anche l'ultimo ma non meno koan nello Zen di Python, import this prompt dell'interprete interattivo).

altrettanto buona, se si rancore i 7 caratteri in più da dire QtCore.whatever, è per abbreviare - from PyQt4 import QtCore as Cr e from PyQt4 import QtGi as Gu (quindi utilizzare Cr.blah e Gu.zorp) o simili. Come tutte le abbreviazioni, è uno scambio di stile tra concisione e chiarezza (preferiresti nominare una variabile count_of_all_widgets_in_the_inventory, num_widgets o x? Spesso la scelta media sarebbe la migliore, ma non sempre ;-).

BTW, non vorrei usare più di un as clausola di un singolo o di fromimport economico (potrebbe essere fonte di confusione), preferirei avere più istruzioni (anche più facile da eseguire il debug di eventuali importazione sta dando problema, per modificare, se cambi le tue importazioni in futuro, ...).

+1

Grazie, molte informazioni utili – Colin

+0

Un altro vantaggio di qualificati: non è possibile importare tutto in un'enorme quantità di lib come PyQt e quindi causare accidentalmente una collisione di spazio dei nomi con qualcosa che non si conosceva. – user106514

+1

forse c'è un errore di battitura, "importa da questo" -> "importa questo" – sunqiang

3

Python doc dice:

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.

può avere effetti collaterali ed essere molto difficile da eseguire il debug

Personnaly, sto usando import piuttosto che from import perché trovo orribili grandi dichiarazioni all'inizio del il file e penso che mantenga il codice più leggibile

import PyQt4 

PyQt4.QtCore 

Se il nome del modulo è troppo lungo e può essere rinominato in locale con la parola chiave as. Per esempio:

import PyQt4.QtCore as Qc 

Spero che aiuta

+0

Quindi, se avessi un gestore di eventi del mouse, ad esempio, potresti avere una riga come questa: "if event.buttons() & PyQt4.QtCore.Qt.LeftButton:"? Ciò non sembra leggibile come "se event.buttons() & Qt.LeftButton:" – Colin

+3

Se è troppo lungo, io faccio: importa PyQt4.QtCore.Qt a Qc e poi Qc.LeftButton – luc

+0

Intendevo: importare PyQt4. QtCore.Qt as Qc – luc

6

Ci sono anche buoni casi per import *. vale a dire. E 'comune per gli sviluppatori Django di avere molti file di configurazione e la catena usando import *:

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

test_settings.py: 
from settings import * 
DEBUG = True 

In questo caso la maggior parte degli svantaggi di import * diventano vantaggi.

+0

Tali file sono miracoli unici che sono progettati per essere importati da una stella. PyQt4.QtGui non si qualifica! C-; – Phlip

+4

@Phlip Agree, ma il titolo di questo post è "L'importazione di caratteri jolly dovrebbe essere evitata?" non "È necessario evitare l'importazione di caratteri jolly ** in PyQt4 **?" –

+0

Penso che questa risposta sia necessaria per mostrare buoni scenari, non solo scegliere lo scenario principale e dire che è male. È come dire "Dovrei guidare la mia macchina su una strada", e qualcuno dice "sì" e qualcun altro dice "no se non ci sono" segni di "nessuna entrata". – James

0

l'importazione per PyQt4 è un caso speciale.
a volte scelgo la "prima opzione" per la codifica rapida e sporca e la trasformo nella "seconda opzione" quando il codice aumenta sempre più a lungo.
lo scontro con lo spazio dei nomi non è un grosso problema qui, non ho visto l'altro nome di pacchetto che inizia con una grande "Q". e ogni volta che finisco uno script PyQt4. convertire "da PyQt4.QtGui import *" in sth. come "

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

" appena cronaca, parentheses for multi-line import è a portata di mano qui.

1

Io uso "import *" per i moduli PyQt che uso, ma li metto nel loro modulo, in modo da non inquinare lo spazio dei nomi dell'utente. per esempio.

In qt4.py:

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

poi usarlo come questo

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

Non è equivalente a "importare PyQt4.QtCore come qt4 "? Suppongo che avresti bisogno di namespace separati per QtCore e QtGui se lo hai fatto, ma non sembra una cosa così brutta. – Colin

+0

È equivalente, se c'è una sola importazione in qt4.py.I Non ho trovato la distinzione tra QtCore, QtGui, ecc ... molto utile durante la programmazione – xioxox

+0

Questa è una bella soluzione che aggira il cruft nella parte superiore dei file di origine.I moduli di Qt non sono in conflitto tra loro, quindi questo non presenta problemi per quanto posso dire. – mfitzp