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

Resuelto Colin asked hace 14 años • 6 respuestas

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?

Colin avatar Sep 01 '10 11:09 Colin
Aceptado

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 thisen 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 Cry from PyQt4 import QtGi as Gu(luego usa Cr.blahy 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_widgetso x? a menudo la opción intermedia sería la mejor, pero no siempre;-).

Por cierto, no usaría más de una ascláusula en una sola declaración fromo 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). ,...).

Alex Martelli avatar Sep 01 '2010 05:09 Alex Martelli

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.

Tomasz Wysocki avatar Sep 01 '2010 05:09 Tomasz Wysocki

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 importen lugar de from importporque 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 aspalabra clave. Por ejemplo:

import PyQt4.QtCore as Qc
luc avatar Sep 01 '2010 05:09 luc

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í.

sunqiang avatar Sep 02 '2010 07:09 sunqiang