Clases principales
El módulo cli ofrece dos funcionalidades principales:
- Creación de menús
- Definición de inductores (prompt)
A cada una de las funcionalidades mencionadas le corresponde una clase.
Menu
La clase Menu permite crear menús cuyas opciones pueden ser seleccionadas mediante una línea de comandos con inductor (prompt) o con la simple pulsación de una tecla.
Lo primero que hay que hacer es definir las opciones. Para ello se debe crear un diccionario donde cada clave será un comando o tecla que apuntará a una lista de dos componentes, la descripción de la opción y la función a ser ejecutada.
opciones = {
'a': ['Opción A', opcion_a],
'b': ['Opción B', opcion_b],
'c': ['Opción C', opcion_c]
}
Luego, hay que instanciar la clase Menu pasándole como parámetro el diccionario de opciones:
menu = Menu(opciones)
Por último, para permitirle al usuario elegir una opción, se debe ejecutar el método pedir:
opcion = menu.pedir('Elija una opción:')
El método pedir devuelve la función que corresponde a la opción (clave del diccionario) seleccionada previamente.
Podemos ahorrarnos un paso y hacer ambas cosas en una sola sentencia:
opcion = Menu(opciones).pedir('Elija una opción:')
Si se desea que la selección se haga presionando una sola tecla, basta con agregar un parámetro más al método pedir:
opcion = Menu(opciones).pedir('Elija una opción:', True)
El parámetro se llama tecla, y debe tener el valor True. Si se desea prescindir del mensaje inductor, la sentencia debe ser:
opcion = Menu(opciones).pedir(tecla=True)
Ahora sólo basta con ejecutar dicha función:
opcion()
Prompt
La clase Prompt permite definir una interfaz de línea de comandos con autocompletado mediante la tecla de tabulación (Tab) y un mensaje de inducción opcional.
Los comandos permitidos se almacenan en una lista. Uno de los comandos de la lista debe reservarse para salir del ciclo.
opciones = ['start', 'stop', 'list', 'print']
salir = opciones[1] # El comando para salir será 'stop'
El ciclo al que nos estamos refiriendo se denomina REPL (Read, Eval, Print Loop) y consiste en leer la cadena ingresada por el usuario, evaluar la sentencia, imprimir el resultado y repetir la operación.
Para instanciar la clase Prompt, se le carga como parámetros la lista de opciones y, opcionalmente, la palabra comando que se definió para salir del ciclo y un mensaje inductor.
prompt = Prompt(opciones)
De no especificarse la palabra comando para salir, se asume 'quit'. Pero en el caso del ejemplo, la palabra es 'stop' y ya la guardamos en salir, por lo tanto la instanciación debe ser:
prompt = Prompt(opciones, salir)
El siguiente paso es invocar el método ciclo():
ciclo = prompt.ciclo()
Como siempre, podemos ahorrarnos un paso de la siguiente manera:
ciclo = Prompt(opciones, salir).ciclo()
El método ciclo() nos devuelve un objeto generador con el cual vamos a obtener las líneas ingresadas por el usuario:
linea = next(ciclo)
Esta sentencia debería estar en un ciclo como el del siguiente ejemplo:
while linea != salir:
linea = next(ciclo)
if linea:
# Aquí se procesa la línea que ingresó el usuario.