Conozco --verbose
o -v
de varias herramientas y me gustaría implementar esto en algunos de mis propios scripts y herramientas.
Pensé en colocar:
if verbose:
print ...
a través de mi código fuente, de modo que si un usuario pasa la -v
opción, la variable verbose
se establecerá en True
y se imprimirá el texto.
¿Es este el enfoque correcto o hay una forma más común?
Además: no estoy pidiendo una forma de implementar el análisis de argumentos. Que yo se como se hace. Solo me interesa especialmente la opción detallada.
Respuestas:
Mi sugerencia es utilizar una función. Pero en lugar de poner el
if
en la función, lo que podría tener la tentación de hacer, hágalo así:(Sí, puede definir una función en un
if
declaración, ¡y solo se definirá si la condición es verdadera!)Si está usando Python 3, donde
print
ya hay una función (o si está dispuesto a usarprint
como función en 2.x usandofrom __future__ import print_function
) es aún más simple:De esta manera, la función se define como no hacer nada si el modo detallado está desactivado (usando una lambda), en lugar de probar constantemente la
verbose
bandera.Si el usuario pudiera cambiar el modo de verbosidad durante la ejecución de su programa, este sería el enfoque incorrecto (necesitaría el
if
en la función), pero como lo está configurando con una marca de línea de comandos, solo necesita tomar la decisión una vez.A continuación, utilice, por ejemplo,
verboseprint("look at all my verbosity!", object(), 3)
cada vez que desee imprimir un mensaje "detallado".fuente
print
función: Acepta muchos argumentos. Se puede implementar comoprint(*args)
en 3.xy comofor arg in args: print arg,
en 2.x. La principal ventaja es que permite mezclar cadenas y cosas de otros tipos en un mensaje sinstr
llamadas / formateo explícitos ni concatenaciones.print arg,
línea?def verboseprint(*args, **kwargs): print(*args, **kwargs)
Utilice el
logging
módulo:Todos estos van automáticamente a
stderr
:Para obtener más información, consulte Python Docs y los tutoriales .
fuente
Construyendo y simplificando la respuesta de @ kindall, esto es lo que uso normalmente:
Esto luego proporciona el siguiente uso en todo su script:
Y su script se puede llamar así:
Un par de notas:
3
que establece el límite superior para su registro, pero lo acepto como un compromiso por simplicidad.v_print
trabajar a lo largo de tu programa, tienes que hacer la basura con lo global. No es divertido, pero desafío a alguien a encontrar una manera mejor.fuente
-v
se usa. En su solución actual, todo se vuelca a stdout en lugar de stderr. Y: normalmente desea transmitir todos los errores al usuario, ¿no es así?Lo que hago en mis scripts es verificar en tiempo de ejecución si la opción 'verbosa' está configurada y luego configurar mi nivel de registro para depurar. Si no está configurado, lo configuro en info. De esta manera, no tendrá comprobaciones "si es detallado" en todo el código.
fuente
Podría ser más limpio si tiene una función, digamos llamada
vprint
, que verifica la bandera detallada por usted. Luego, simplemente llame a su propiavprint
función en cualquier lugar que desee verbosidad opcional.fuente
Robé el código de registro de virtualenv para un proyecto mío. Mira en el
main()
devirtualenv.py
ver cómo se ha inicializado. El código se roció conlogger.notify()
,logger.info()
,logger.warn()
, y similares. Qué métodos en realidad salida Emit está determinado por si virtualenv se invocó con-v
,-vv
,-vvv
, o-q
.fuente
La solución de @ kindall no funciona con mi versión 3.5 de Python. @styles indica correctamente en su comentario que la razón es el argumento de palabras clave opcionales adicionales . Por lo tanto, mi versión ligeramente refinada para Python 3 se ve así:
fuente
Podría haber una variable global, probablemente establecida con
argparse
fromsys.argv
, que represente si el programa debe ser detallado o no. Luego, se podría escribir un decorador de manera que si la verbosidad estuviera activada, la entrada estándar se desviaría al dispositivo nulo siempre que la función se ejecutara:Esta respuesta está inspirada en este código ; en realidad, lo iba a usar como un módulo en mi programa, pero obtuve errores que no podía entender, así que adapté una parte.
La desventaja de esta solución es que la verbosidad es binaria, a diferencia de con
logging
, lo que permite un ajuste más fino de cuán detallado puede ser el programa. Además, todas lasprint
llamadas se desvían, lo que podría ser no deseado.fuente
Lo que necesito es una función que imprima un objeto (obj), pero solo si la variable global detallada es verdadera, de lo contrario no hace nada.
Quiero poder cambiar el parámetro global "verbose" en cualquier momento. Para mí, la sencillez y la legibilidad son de suma importancia. Entonces procedería como lo indican las siguientes líneas:
La variable global "detallada" también se puede configurar desde la lista de parámetros.
fuente