Exigences De L'Examen
- utiliser
argparse
(je vais ignorer celui-ci)
- permettre à une ou deux actions à être appelé (au moins un).
- essayez par Pythonic (je préfère l'appeler "POSIX"-like)
Il y a aussi quelques exigences implicites lorsque l'on vit sur la ligne de commande:
- expliquer l'utilisation de l'utilisateur d'une manière qui est facile à comprendre
- les options sont facultatives
- permettre la spécification des drapeaux et des options
- permettent de combiner avec d'autres paramètres (comme le nom de fichier ou les noms).
Exemple de solution à l'aide d' docopt
(fichier managelog.py
):
"""Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
Essayez de le lancer:
$ python managelog.py
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Afficher l'aide:
$ python managelog.py -h
Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> P managelog.py [options] upload -- <logfile>...
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
Et de l'utiliser:
$ python managelog.py -V -U user -P secret upload -- alfa.log beta.log
{'--': True,
'--pswd': 'secret',
'--user': 'user',
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': False,
'upload': True}
Court de rechange short.py
Il peut être encore plus courte variante:
"""Manage logfiles
Usage:
short.py [options] (process|upload)... -- <logfile>...
short.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
L'utilisation ressemble à ceci:
$ python short.py -V process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 1,
'upload': 1}
Remarque, qu'au lieu de valeurs booléennes pour les "processus" et "télécharger" clés il existe des compteurs.
Il s'avère, nous ne pouvons pas éviter la duplication de ces mots:
$ python short.py -V process process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 2,
'upload': 1}
Conclusions
La conception d'une bonne interface de ligne de commande peut être difficile parfois.
Il y a plusieurs aspects de base de ligne de commande programme:
- une bonne conception de la ligne de commande
- la sélection et à l'utilisation appropriée de l'analyseur
argparse
offre beaucoup, mais limite les scénarios possibles et peuvent devenir très complexes.
Avec docopt
les choses vont beaucoup plus courts tout en préservant la lisibilité et offrant un haut degré de flexibilité. Si vous parvenez à obtenir analysé les arguments de dictionnaire et faire un peu de conversions (en entier, à l'ouverture des fichiers..) à la main (ou par d'autres bibliothèque appelée schema
), vous trouverez peut - docopt
bon pour la ligne de commande de l'analyse.