Requisitos en cuanto al
- use
argparse
(voy a ignorar este)
- permiten llamar a una o dos acciones (al menos una requerida).
- intentan por Pythonic (prefiero llamarlo "POSIX" -como)
También hay algunos requisitos implícitos cuando se vive en la línea de comandos:
- explicaremos el uso para el usuario en de manera que es fácil de entender
- opciones será opcional
- permiten especificar banderas y opciones
- permite combinar con otros parámetros (como fil nombre o nombres).
Solución de muestra usando docopt
(archivo 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
intento ejecutarlo:
$ python managelog.py
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Muestra la ayuda:
$ 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>
y usarlo:
$ 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}
Corto alternativo short.py
No puede ser variante aún más corto:
"""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
uso es el siguiente:
$ 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}
Tenga en cuenta, que en lugar de valores booleanos para "proceso" y las teclas "cargar" hay contadores.
Resulta, no podemos evitar la duplicación de estas palabras:
$ 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}
Conclusiones
Diseño de buena interfaz de línea de comandos puede ser un reto en algún momento.
hay múltiples aspectos del programa basado en línea de comandos:
- buen diseño de línea de comandos
- Selección/Uso analizador adecuado
argparse
ofrece mucho, pero restringe los posibles escenarios y puede volverse muy complejo.
Con docopt
las cosas son mucho más cortas, a la vez que se conserva la legibilidad y ofrece un alto grado de flexibilidad. Si gestiona la obtención de argumentos analizados del diccionario y realiza algunas conversiones (en enteros, abriendo archivos ...) manualmente (o en otra biblioteca llamada schema
), puede encontrar que docopt
es adecuado para el análisis de línea de comandos.
'-x' es universalmente una bandera y opcional. Corta el '-' si es necesario. – delnan
¿No podría hacer que 'process' sea el comportamiento predeterminado (sin la necesidad de especificar ninguna opción) y permitir que el usuario lo cambie a la opción' upload' si * that * está establecido? Por lo general, las opciones deben ser opcionales, de ahí el nombre. Se deben evitar las opciones requeridas (esto también está en los documentos 'argparse'). –
@ Adamvatan Hace casi tres años que hizo su pregunta, pero me gustó el desafío oculto y usé la ventaja de que había nuevas soluciones disponibles para este tipo de tareas. –