Je connais le --verbose
ou -v
plusieurs outils et j'aimerais l'implémenter dans certains de mes propres scripts et outils.
J'ai pensé à placer:
if verbose:
print ...
via mon code source, de sorte que si un utilisateur passe l' -v
option, la variable verbose
sera définie sur True
et le texte sera imprimé.
Est-ce la bonne approche ou existe-t-il une méthode plus courante?
Ajout: Je ne demande pas un moyen d'implémenter l'analyse des arguments. Que je sais comment cela se fait. Je ne suis particulièrement intéressé que par l'option verbeuse.
Réponses:
Ma suggestion est d'utiliser une fonction. Mais plutôt que de mettre le
if
dans la fonction, ce que vous pourriez être tenté de faire, faites-le comme ceci:(Oui, vous pouvez définir une fonction dans une
if
instruction, et elle ne sera définie que si la condition est vraie!)Si vous utilisez Python 3, où
print
est déjà une fonction (ou si vous êtes prêt à l'utiliserprint
comme fonction dans 2.x en utilisantfrom __future__ import print_function
), c'est encore plus simple:De cette façon, la fonction est définie comme une action à ne rien faire si le mode verbeux est désactivé (en utilisant un lambda), au lieu de tester constamment l'
verbose
indicateur.Si l'utilisateur pouvait changer le mode de verbosité pendant l'exécution de votre programme, ce serait la mauvaise approche (vous auriez besoin du
if
dans la fonction), mais puisque vous le définissez avec un indicateur de ligne de commande, il vous suffit de prendre la décision une fois.Vous utilisez ensuite par exemple
verboseprint("look at all my verbosity!", object(), 3)
chaque fois que vous souhaitez imprimer un message "détaillé".la source
print
fonction: Acceptez de nombreux arguments. Il peut être implémenté commeprint(*args)
dans 3.x et commefor arg in args: print arg,
dans 2.x. Le principal avantage est qu'il permet de mélanger des chaînes et des objets d'autres types dans un message sansstr
appels / formatage et concaténations explicites .print arg,
ligne?def verboseprint(*args, **kwargs): print(*args, **kwargs)
Utilisez le
logging
module:Tous ces éléments vont automatiquement à
stderr
:Pour plus d'informations, consultez la documentation Python et les didacticiels .
la source
Construire et simplifier la réponse de @ kindall, voici ce que j'utilise généralement:
Cela fournit ensuite l'utilisation suivante tout au long de votre script:
Et votre script peut être appelé comme ceci:
Quelques remarques:
3
qui définit la limite supérieure de votre journalisation, mais j'accepte cela comme un compromis pour la simplicité.v_print
travailler tout au long de votre programme, vous devez faire les choses inutiles avec le global. Ce n'est pas amusant, mais je mets au défi quelqu'un de trouver un meilleur moyen.la source
-v
est utilisé. Dans votre solution actuelle, tout est sauvegardé sur stdout au lieu de stderr. Et: vous voulez normalement relayer chaque erreur à l'utilisateur, n'est-ce pas?Ce que je fais dans mes scripts est de vérifier lors de l'exécution si l'option «verbose» est définie, puis de définir mon niveau de journalisation sur débogage. S'il n'est pas défini, je le règle sur info. De cette façon, vous n'avez pas de vérifications «if verbose» dans tout votre code.
la source
Cela pourrait être plus propre si vous avez une fonction, disons appelée
vprint
, qui vérifie l'indicateur détaillé pour vous. Ensuite, vous appelez simplement votre proprevprint
fonction à n'importe quel endroit où vous souhaitez une verbosité facultative.la source
J'ai volé le code de journalisation de virtualenv pour un de mes projets. Regardez dans
main()
devirtualenv.py
voir comment il est initialisé. Le code est saupoudré aveclogger.notify()
,logger.info()
,logger.warn()
et autres. Quelles sont les méthodes effectivement sortie Emit est déterminée par le fait que virtualenv a été invoqué avec-v
,-vv
,-vvv
ou-q
.la source
La solution de @ kindall ne fonctionne pas avec ma version 3.5 de Python. @styles indique correctement dans son commentaire que la raison est l' argument de mots-clés facultatifs supplémentaires . D'où ma version légèrement raffinée pour Python 3 ressemble à ceci:
la source
Il peut y avoir une variable globale, probablement définie avec
argparse
fromsys.argv
, qui indique si le programme doit être détaillé ou non. Ensuite, un décorateur pourrait être écrit de telle sorte que si la verbosité était activée, l'entrée standard serait détournée vers le périphérique nul tant que la fonction devait s'exécuter:Cette réponse est inspirée de ce code ; en fait, j'allais simplement l'utiliser comme module dans mon programme, mais j'ai eu des erreurs que je ne pouvais pas comprendre, alors j'en ai adapté une partie.
L'inconvénient de cette solution est que la verbosité est binaire, contrairement à avec
logging
, qui permet d'ajuster plus finement le degré de verbosité du programme. De plus, tous lesprint
appels sont détournés, ce qui peut être indésirable.la source
Ce dont j'ai besoin, c'est d'une fonction qui imprime un objet (obj), mais seulement si la variable globale verbose est vraie, sinon elle ne fait rien.
Je souhaite pouvoir modifier à tout moment le paramètre global "verbose". La simplicité et la lisibilité sont pour moi d'une importance capitale. Je procéderais donc comme l'indiquent les lignes suivantes:
La variable globale "verbose" peut également être définie à partir de la liste des paramètres.
la source