Pregunta

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

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

A continuación, pylint da cientos de advertencias "de importación no utilizados". Estoy indeciso a solo apagarlos, porque puede haber otras importaciones no utilizados que son realmente útiles para ver. Otra opción podría ser la de hacer esto:

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

y termino que tiene 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 utilizan.

En este punto yo soy agnóstico en cuanto a cuál termino haciendo en mi proyecto, aunque este último parece ser la más dolorosa de mi perspectiva. ¿Cuáles son las prácticas comunes aquí? Hay razón técnica para utilizar un estilo sobre el otro?

¿Fue útil?

Solución

La respuesta al título de tu pregunta es "sí": Recomiendo no usar nunca from ... import *, y yo discutimos las razones en otra respuesta muy reciente. En pocas palabras, nombres cualificados son bien , barenames son muy limitados, por lo que la "tercera opción" es óptima (como se va a utilizar nombres cualificados, no barenames) entre los que se presente.

(Ventajas de nombres cualificados wrt barenames incluyen la facilidad de falsificar / burlarse Para propósitos de prueba, reducido a riesgo anulada de errores inadvertidos inducidos por reconsolidación accidental, capacidad de "semi-falso" el nombre superior en una "clase rastreo" para la propósito de registrar exactamente lo que está utilizando y facilitando actividades tales como perfiles, y así sucesivamente - desventajas, casi ninguno ... ver también el último-pero-no-menos koan en el Zen de Python, import this en el interactivo intérprete del sistema).

Igualmente bueno, si GRUDGE los 7 caracteres adicionales que decir QtCore.whatever, es para abreviar - from PyQt4 import QtCore as Cr y from PyQt4 import QtGi as Gu (a continuación, utilizar Cr.blah y Gu.zorp) o similares. Al igual que todas las abreviaturas, que es una solución de compromiso entre el estilo de la concisión y claridad (sería más bien el nombre de una variable count_of_all_widgets_in_the_inventory, num_widgets o x a menudo la opción intermedia sería mejor, pero no siempre; -?)

.

Por cierto, yo no usaría más de una cláusula de as en una sola declaración o from import (podría ser confuso), prefiero tener varias instrucciones (también más fácil de depurar si alguno de importación está dando problema, a editar si cambiar sus importaciones en el futuro, ...).

Otros consejos

También hay buenos casos para import *. es decir. Es común que los desarrolladores de Django que tiene muchos archivos de configuración y la cadena de ellos mediante la importación *:

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

test_settings.py:
from settings import *
DEBUG = True

En este caso, la mayoría de los inconvenientes de ventajas import * convertido.

doc Python 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 en lugar de from import porque encuentro grandes declaraciones terribles en el principio del archivo y creo que mantiene el código sea más legible

import PyQt4

PyQt4.QtCore

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

 import PyQt4.QtCore as Qc

espero que ayude

Yo uso el "import *" para los módulos de PyQt que uso, pero los puso en su propio módulo, por lo que no contamina el espacio de nombres de usuario. por ejemplo.

En qt4.py:

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

A continuación, utilizar de esta manera

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

importación de PyQt4 es un caso especial.
A veces voy a elegir la "primera opción" para una rápida y sucia de codificación, y convertirlo a la "segunda opción" cuando el código se hace más larga y más larga.
colisión espacio de nombres quizás no es un gran problema aquí, no he ver otro comienza package'name con una gran "Q". y cada vez que termino un guión PyQt4. convertido "de importación PyQt4.QtGui *" para algo. como "

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

" lo digo, paréntesis para multi-línea de importación es útil aquí.

Soy demasiado absolutamente en contra de import * en el caso general. En el caso de PySide2, una de las raras excepciones se aplica:

from PySide2 import *

es el patrón para importar todos los módulos conocidos de PySide2. Esta importación es muy conveniente, ya que la importación es siempre correcta. La constante se calcula a partir del generador de CMAKE. Muy útil cuando se trata de algo rápidamente en la consola interactiva, sino también en las pruebas automatizadas.

Para el uso avanzado, tiene también sentido para utilizar la variable PySide2.__all__ directamente, que implementa este característica. Los elementos de PySide2.__all__ están clasificadas por dependencia, por lo que primero viene QtCore, entonces QtGui, QtWidgets, ... y así sucesivamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top