ti-enxame.com

A importação de caracteres curinga deve ser evitada?

Eu estou usando PyQt e estou correndo para este problema. Se minhas instruções de importação são:

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

em seguida, o pylint fornece centenas de avisos de "Importação não usada". Eu hesito em simplesmente desativá-los, porque pode haver outras importações não usadas que são realmente úteis para ver. Outra opção seria fazer isso:

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

e acabo tendo 9 aulas na linha QtGui. Existe uma terceira opção, que é:

from PyQt4 import QtCore, QtGui

e prefixar todas as classes com QtCore ou QtGui sempre que eu as usar.

Neste ponto, sou agnóstico quanto ao que acabo fazendo no meu projeto, embora o último pareça mais doloroso do meu ponto de vista. Quais são as práticas comuns aqui? Existem razões técnicas para usar um estilo sobre o outro?

40
Colin

A resposta para o título da sua pergunta é "sim": eu recomendo nunca usar from ... import *, e eu discuti as razões em outra resposta muito recente. Resumidamente, nomes qualificados são bons , nomes de barras são muito limitados, então a "terceira opção" é ótima (como você estará usando nomes qualificados, não nomes de barras) entre os que você apresenta.

(Vantagens de nomes qualificados com nomes de barra incluem facilidade de falsificação/zombaria para fins de teste, reduzido a risco anulado de erros despercebidos induzidos por religamento acidental, capacidade de "semi-falsificar" o nome de topo em uma "classe de rastreamento" para fins de registro exatamente o que você está usando e facilitando atividades como criação de perfil, e assim por diante - desvantagens, apenas sobre nenhum ... veja também o último-mas-não menos koan no Zen do Python, import this no interpretador interativo Prompt) .

Igualmente bom, se você ressentir os 7 caracteres extras para dizer QtCore.whatever, é para abreviar - from PyQt4 import QtCore as Cr e from PyQt4 import QtGi as Gu (então use Cr.blah e Gu.zorp) ou algo semelhante. Como todas as abreviações, é uma troca de estilo entre concisão e clareza (você prefere nomear uma variável count_of_all_widgets_in_the_inventory, num_widgets ou x? Frequentemente a escolha do meio seria a melhor, mas nem sempre ;-).

BTW, eu não usaria mais de uma cláusula as em uma única instrução from ou import (poderia ser confusa), eu prefiro ter várias instruções (também mais fácil de depurar se alguma importação está dando problema, para editar se você alterar suas importações no futuro, ...).

41
Alex Martelli

Há também bons casos para import *. ie. É comum os desenvolvedores do Django terem muitos arquivos de configuração e encadear usando import *:

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

test_settings.py:
from settings import *
DEBUG = True

Nesse caso, a maioria das desvantagens de import * se tornam vantagens. 

8
Tomasz Wysocki

Python doc diz:

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.

Pode ter efeitos colaterais e ser muito difícil de depurar

Pessoalmente, estou usando import em vez de from import porque encontro grandes declarações no início do arquivo e acho que ele mantém o código mais legível

import PyQt4

PyQt4.QtCore

Se o nome do módulo for muito longo e puder ser renomeado localmente com a palavra-chave as. Por exemplo:

 import PyQt4.QtCore as Qc

Espero que ajude

3
luc

Eu uso o "import *" para os módulos PyQt que uso, mas os coloco em seu próprio módulo, para não poluir o namespace do usuário. por exemplo.

Em qt4.py:

 da importação PyQt4.QtCore * 
 da importação PyQt4.QtGui * 

Então use-o assim

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

a importação para o PyQt4 é um caso especial.
às vezes escolho a "primeira opção" para codificação rápida e suja e a "segunda opção" quando o código cresce mais e mais.
colisão de namespace talvez não seja grande coisa aqui, eu não vejo outro nome de pacote começa com um grande "Q". e sempre que eu terminar um script PyQt4. converter "de PyQt4.QtGui import *" para sth. gostar "

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

" apenas FYI, parênteses para importação de várias linhas é útil aqui.

0
sunqiang