Conozco --verboseo -vde 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 -vopción, la variable verbosese establecerá en Truey 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
ifen la función, lo que podría tener la tentación de hacer, hágalo así:(Sí, puede definir una función en un
ifdeclaración, ¡y solo se definirá si la condición es verdadera!)Si está usando Python 3, donde
printya hay una función (o si está dispuesto a usarprintcomo 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
verbosebandera.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
ifen 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
printfunció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 sinstrllamadas / formateo explícitos ni concatenaciones.print arg,línea?def verboseprint(*args, **kwargs): print(*args, **kwargs)Utilice el
loggingmó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:
3que establece el límite superior para su registro, pero lo acepto como un compromiso por simplicidad.v_printtrabajar 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
-vse 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 propiavprintfunció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.pyver 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
argparsefromsys.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 lasprintllamadas 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