Pregunta ¿Debería evitarse la importación de 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 da cientos de advertencias de "importación no utilizada". Tengo dudas de simplemente apagarlos, porque podría haber otras importaciones no utilizadas que son realmente ú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 cada vez que los uso.

En este punto, soy agnóstico en cuanto a cuál terminaré haciendo en mi proyecto, aunque el último parece el más doloroso desde mi punto de vista. ¿Cuáles son las prácticas comunes aquí? ¿Hay alguna razón técnica para usar un estilo sobre el otro?


32
2017-09-01 04:54


origen


Respuestas:


La respuesta al título de su pregunta es "sí": recomiendo no usar nunca from ... import *y discutí las razones en otra respuesta muy reciente. En resumen, los nombres calificados son bueno, los nombres desnudos son muy limitados, por lo que la "tercera opción" es óptima (ya que usará nombres calificados, no desnudos) entre los que presente.

(Las ventajas de los nombres calificados con nombres desnudos incluyen la facilidad de falsificación / burla para fines de prueba, reducción al riesgo anulado de errores inadvertidos inducidos por reenlace accidental, capacidad de "semifaltar" el nombre superior en una "clase de seguimiento" con el fin de registrar exactamente lo que está usando y facilitando actividades como el perfil, etc., desventajas, casi ninguna ... vea también el último pero no menos importante koan en el Zen de Python, import this en el intérprete interactivo).

Igualmente bueno, si reniegas de 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 similar. Como todas las abreviaturas, se trata de un equilibrio de estilo entre concisión y claridad (¿prefieres nombrar una variable? count_of_all_widgets_in_the_inventory, num_widgets, o x? a menudo la opción del medio sería la mejor, pero no siempre ;-).

Por cierto, no usaría más de uno as cláusula en un solo from o import declaración (podría ser confusa), prefiero tener varias declaraciones (también más fáciles de depurar si alguna importación está dando problemas, editar si cambia sus importaciones en el futuro, ...).


32
2017-09-01 05:17



También hay buenos casos para import *. es decir. es común para los desarrolladores de Django tener muchos archivos de configuración y encadenarlos 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 de import * convertirse en ventajas.


7
2017-09-01 05:24



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

Personnaly, estoy usando import más bien que from import porque encuentro grandes declaraciones horribles 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 renombrarse localmente con el as palabra clave. Por ejemplo:

 import PyQt4.QtCore as Qc

Espero que ayude


3
2017-09-01 05:09



Utilizo la "importación *" para los módulos PyQt que uso, pero los pongo en su propio módulo, para que no contamine el espacio de nombres del usuario. p.ej.

En qt4.py:

 de la importación PyQt4.QtCore *
 de la importación PyQt4.QtGui *

Entonces úsalo así

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

1
2018-02-25 16:06



importar para PyQt4 es un caso especial.
a veces elegiré la "primera opción" para una codificación rápida y sucia, y la convertiré en la "segunda opción" cuando el código crezca más y más.
colisión del espacio de nombres quizás no sea un gran problema aquí, no he visto otro nombre de paquete que comience con una gran "Q". y cada vez que termino 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, paréntesis para la importación de líneas múltiples es útil aquí.


0
2017-09-02 07:07