¿Debería evitarse la importación de comodines?

Estoy usando PyQt y estoy corriendo en este problema. Si mis declaraciones de importación son:

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

luego pylint da cientos de advertencias de “importación no utilizada”. Estoy indeciso de simplemente desactivarlos, porque puede haber otras importaciones no utilizadas que realmente son útiles para ver. Otra opción sería hacer esto:

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

Y termino teniendo 9 clases en la línea QtGui. Hay una tercera opción, que es:

 from PyQt4 import QtCore, QtGui 

y luego prefijo todas las clases con QtCore o QtGui siempre que las use.

En este punto, soy agnóstico en cuanto a cuál termino haciendo en mi proyecto, aunque el último parece ser el más doloroso desde mi perspectiva. ¿Cuáles son las prácticas comunes aquí? ¿Hay razones técnicas para usar un estilo sobre el otro?

La respuesta al título de su pregunta es “sí”: recomiendo nunca usar from ... import * , y analicé las razones en otra respuesta muy reciente. Brevemente, los nombres calificados son buenos , los nombres de barras son muy limitados, por lo que la “tercera opción” es óptima (ya que usará nombres calificados, no nombres de barras) entre los que presente.

(Las ventajas de los nombres calificados y los nombres de barras incluyen la facilidad de falsificación / burla para propósitos de prueba, se reduce a un riesgo anulado de errores inadvertidos inducidos por un nuevo encuadernado accidental, la capacidad de “semi-falsificar” el nombre más alto en una “clase de rastreo” para el registro exactamente lo que está utilizando y facilitando tales actividades como creación de perfiles, etc. desventajas, casi ninguna … vea también el último pero no menos importante koan en el zen de Python, import this en el indicador interactivo del intérprete ).

Igual de bueno, si te opones a los 7 caracteres adicionales para decir QtCore.whatever , es abreviar: from PyQt4 import QtCore as Cr y from PyQt4 import QtGi as Gu (luego usa Cr.blah y Gu.zorp ) o similares. Como todas las abreviaturas, es un compromiso de estilo entre concisión y claridad (¿preferiría nombrar una variable count_of_all_widgets_in_the_inventory , num_widgets o x ? A menudo la opción intermedia sería la mejor, pero no siempre ;-).

Por cierto, no usaría más de una as cláusula en una sola statement from o de import (podría ser confuso), prefiero tener varias declaraciones (también es más fácil de depurar si hay problemas con la importación, para editar si cambia sus importaciones) en el futuro, …).

También hay buenos casos para la import * . es decir. es común que los desarrolladores de Django tengan muchos archivos de configuración y los encadenen utilizando import *:

 settings.py: FOO = 1 BAR = 2 DEBUG = False test_settings.py: from settings import * DEBUG = True 

En este caso, la mayoría de las desventajas de la import * convierten en ventajas.

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.

Puede tener efectos secundarios y ser muy difícil de depurar.

Personalmente, estoy usando la import lugar from import porque encuentro declaraciones muy grandes al principio del archivo y creo que mantiene el código más legible

 import PyQt4 PyQt4.QtCore 

Si el nombre del módulo es demasiado largo y puede ser renombrado localmente con la palabra clave as . Por ejemplo:

  import PyQt4.QtCore as Qc 

Espero que ayude

Utilizo “importar *” para los módulos PyQt que utilizo, pero los coloco en su propio módulo, por lo que no contamina el espacio de nombres del usuario. p.ej

En qt4.py:

  de PyQt4.QtCore import *
  desde PyQt4.QtGui import *

Entonces úsalo así

  importar qt4
  app = qt4.QApplication (...)

Importar para PyQt4 es un caso especial.
a veces, elijo la “primera opción” para una encoding rápida y sucia, y la convertiré en la “segunda opción” cuando el código crezca cada vez más.
la colisión del espacio de nombres tal vez no sea un gran problema aquí, no he visto que el nombre de otro paquete comience con una gran “Q”. y cada vez que termine un script PyQt4. convertir “de PyQt4.QtGui import *” a sth. me gusta ”

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

“solo para tu información, los paréntesis para la importación multilínea son útiles aquí.