2012-08-14 17 views
19

Así que estoy trabajando en un proyecto en Python y tratando de mantenerlo en estándares con la pildora y en general. Por lo tanto, tengo un archivo de origen, (sólo tendremos que llamarlo a.py)"Advertencia de importación no utilizada" y pylint

#a.py 
import loggingsetup 

def foo(): 
    log.info("This is a log message") 

Pero, quiero controlar lo que el registro se parece, por lo que en loggingsetup tengo algo como:

#loggingsetup.py 
import logging 

logging.root.setLevel(logging.DEBUG) 

consoleOut = logging.StreamHandler() 
consoleOut.setLevel(logging.INFO) 
consoleOut.setFormatter(logging.Formatter("\t"+logging.BASIC_FORMAT)) 
logging.root.addHandler(consoleOut) 

#etc 

Ahora, esto parece funcionar bien. Supongo que como pregunta preliminar debería preguntar si esta es la forma correcta de hacerlo, o si hay una forma diferente de estructurar mi código que sería preferible.

Pero mi pregunta principal es que cuando ejecuto pylint en a.py recibo una advertencia como "importación no utilizada - import loggingsetup", ya que en realidad no estoy llamando a ningún método o función de loggingsetup.

Podría hacer algo así como redefinir el cuerpo de loggingsetup como una función y llamarlo, pero parece tonto y propenso a errores (tendría que preocuparme de llamarlo dos veces si importase loggingsetup desde otro lugar, y si entiendo cómo Python maneja las importaciones, eso no es un problema con mi configuración actual).

Pudiera simplemente decirle a la empresa que ignore la advertencia, pero pensé que podría preguntar aquí primero para asegurarme de que esto no sea algo que deba manejar de manera diferente.

+11

Importación de un módulo sólo por sus efectos secundarios se siente mal a mí. Hace que la intención de tu código sea más difícil de discernir. Explícito es mejor que implícito. –

+0

Es solo una advertencia de que puede haber olvidado algo y/o puede estar haciendo algo innecesario. Ignora si ese no es el caso. – martineau

+1

En cierto modo estoy en desacuerdo con el sentimiento anterior de martineau. Sí, a veces es así, y tienes que ignorar las advertencias, pero por lo general las advertencias no deben tratarse como "recordatorios amistosos" e ignorarlas sin estar seguras, por lo que llegué a asegurarme de que podía ignorarlo, o obtener un mejor enfoque. – Retsam

Respuesta

9

El enfoque que utilizaría es usar loggingsetup como una especie de envoltorio para logging.

import logging 

# set up logging config here 

from logging import * 

Luego, en los otros módulos que:

import loggingsetup as logging 

Es posible que desee utilizar un nombre que no sea loggingsetup en este caso, por ejemplo, tweaked_logging o logging_with_my_settings.

+0

Desde la perspectiva de mi advertencia original, eso funciona, y definitivamente me gusta esta idea. Ahora tengo una queja sobre la importación de comodines, y todas las importaciones no usadas en loggingsetup.py (aunque tomé su consejo y le cambié el nombre) – Retsam

+0

Ah, pylint ...: -/ – kindall

+0

No lo he intentado, pero poner el comentario '# pylint: disable-msg-cat =' en la parte superior de su módulo contenedor debería permitirle suprimir categorías específicas de advertencias solo en ese módulo. Al menos has aislado toda la "maldad" en un módulo. :-) – kindall

2

el código debe estar en una función llamada una vez en el script principal

2

Como se ha mencionado usted mismo envolviéndolo en una función y llamar a la configuración de forma explícita que solucionar esta advertencia. Y como mencionó Steven, esto se consideraría un mejor código ya que es más explícito sobre lo que estás haciendo.

Si le preocupa llamar a esta función dos veces, puede utilizar una bandera de módulo interno para permitir la ejecución del cuerpo de la función solo una vez.

__initialized = False 

def init(): 
    if not __initialized: 
     __initialized = True 
     #DoStuff 
+0

Correcto, y esto funcionaría, pero no puedo evitar sentir que es una especie de sacrificios "Simple es mejor que complejo" para hacerlo de esta manera. No estaría envolviendo el cuerpo de la secuencia de comandos, pero también tendría que recordar agregar la llamada de función a cualquier importación. No es terrible, pero no es tan simple. Sería una buena opción en algunos casos, pero en este caso, creo que la respuesta de Kindall es la mejor. – Retsam

23

En tales casos, todavía se puede decir de manera explícita pylint que esta importación no utilizado en la intención:

import loggingsetup # pylint: disable=unused-import 

Aviso la instrucción está en la misma línea que la importación de modo W0611 solamente está deshabilitada para esta línea , y no para todo el bloque de abajo.

8

Si utiliza pylint y flake8 puede pasar por alto la advertencia no utilizada de importaciones en ambas herramientas de esta manera:

import loggingsetup # noqa # pylint: disable=unused-import 
+0

Parece que necesita * dos espacios * antes del comienzo del "segundo comentario": '# noqa # pylint: disable = unsused-import' –

Cuestiones relacionadas