¿Debería evitarse la importación con comodines?
Estoy usando PyQt y me encuentro con este problema. Si mis declaraciones de importación son:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
luego pylint ofrece cientos de advertencias de "importación no utilizada". Dudo en desactivarlos, porque puede haber otras importaciones no utilizadas que son realmente útiles de 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 anteponga todas las clases con QtCore o QtGui cada vez que las use.
A estas alturas soy agnóstico sobre cuál termino haciendo en mi proyecto, aunque el último me parece el más doloroso desde mi perspectiva. ¿Cuáles son las prácticas comunes aquí? ¿Existe alguna razón técnica para utilizar un estilo sobre el otro?
La respuesta al título de su pregunta es "sí": recomiendo nunca usar from ... import *
, y hablé de los motivos en otra respuesta muy reciente. Brevemente, los nombres calificados son buenos , los nombres básicos son muy limitados, por lo que la "tercera opción" es óptima (ya que utilizará nombres calificados, no nombres básicos) entre los que presente.
(Las ventajas de los nombres calificados con respecto a los nombres básicos incluyen la facilidad de falsificar/burlarse con fines de prueba, reducir el riesgo de anulación de errores inadvertidos inducidos por una nueva vinculación accidental, la capacidad de "semi-falsificar" el nombre principal en una "clase de rastreo" con el fin de registrar exactamente lo que estás usando y facilitando actividades como la creación de perfiles, etc. (desventajas, casi ninguna... consulte también el último pero no menos importante koan en el Zen de Python, import this
en el indicador del intérprete interactivo).
Igualmente bueno, si te molestan 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 algo similar. Como todas las abreviaturas, es un equilibrio de estilo entre concisión y claridad (¿preferirías 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 declaración from
o import
(podría ser confuso), prefiero tener varias declaraciones (también es más fácil de depurar si alguna importación está dando problemas, para editar si cambia sus importaciones en el futuro). ,...).
También hay buenos casos para import *
. es decir. Es común que los desarrolladores de Django tengan muchos archivos de configuración y los encadenen usando 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 import *
se convierten en ventajas.
El documento de Python dice:
Aunque ciertos módulos están diseñados para exportar solo nombres que siguen ciertos patrones cuando usa import *, todavía se considera una mala práctica en el código de producción.
Puede tener efectos secundarios y ser muy difícil de depurar.
Personalmente, estoy usando import
en lugar de from import
porque encuentro declaraciones muy grandes al principio del archivo y creo que hace que el código sea más legible.
import PyQt4
PyQt4.QtCore
Si el nombre del módulo es demasiado largo, se puede cambiar el nombre localmente con la as
palabra clave. Por ejemplo:
import PyQt4.QtCore as Qc
La importación para PyQt4 es un caso especial.
a veces elijo la "primera opción" para una codificación rápida y sucia, y la cambio a la "segunda opción" cuando el código se hace cada vez más largo.
La colisión de espacios de nombres tal vez no sea un gran problema aquí, no he visto que el nombre de otro paquete comience con una "Q" grande. y cada vez que termino un script PyQt4. convertir "de PyQt4.QtGui importar *" a algo. como "
from PyQt4.QtGui import (QApplication, QDialog, QLineEdit, QTextBrowser,
QVBoxLayout)
"Solo para su información, los paréntesis para la importación de varias líneas son útiles aquí.