Inicio > Programing > Python: Autocompletado en raw_input()

Python: Autocompletado en raw_input()

autocompletado-06
Al desarrollar algunos scripts en python para consola, se requiere de interacción en menor o mayor medida con el usuario, según sea el caso, el asunto es que en algunas situaciones la información teclea el usuario es considerable, lo que aumenta la posibilidad de tener información errónea capturada, claro se que se puede hacer validación, pero será una ves que haya escrito toda una línea.

Entonces la propuesta es ir haciendo auto completado de palabras como lo hacen las búsquedas de google o, almenos de forma similar, proporcionando las opciones disponibles con las que cuenta (claro siempre que estas existan), de esta manera la información capturada sería más exacta y además se le ayudaría al usuario a proporcionar la información con mayor rapidez al no tener que teclear toda la información.

He iniciado una búsqueda de posibilidades y me he encontrado con el módulo readline que al escribir un caracter y presionar la tecla TAB muestra sugerencias, aunque de base las sugerencias están relacionadas con nombres de archivos, pero se puede modificar ese comportamiento, así que veamos como es posible.

Primero, su uso básico sería algo así:

#!/usr/bin/python
#-*- coding: utf-8 -*-

import readline

readline.parse_and_bind("tab: completed")

entrada = raw_input('rctorr> ')

Al ejecutar el script se observa como ahora puedo incluso editar el texto que escribo en la petición del raw_input().
autocompletado-01

Hasta aquí todo bien, pero que pasa con la predicción o completación de palabras?

Pues resulta que readline permite sobre escribir la función de auto completado y un ejemplo queda de la siguiente forma:

#!/usr/bin/python
#-*- coding: utf-8 -*-

import readline

readline.parse_and_bind("tab: complete")

def complete(text, state):
    """
        Remplaza cualquier cosa escrita, ya sea una letra o una palabra por la
        palabra "Éxito!" al presionar la tecla TAB
    """
    results = ["Éxito!", None] # Lista de posibilidades
    
    return results[state]

# Se cambia la función de completar por la propia
readline.set_completer(complete)

entrada = raw_input('rctorr> ')

print entrada

El resultado es que cuando escribo una, letra o palabra o texto…
autocompletado-02
y al presionar la tecla TAB se remplaza en automático por…
autocompletado-03

Esto es maaaaagia!!!!

Incluyendo nuestra propia lista de palabras sugeridas

Ahora toca ampliar la lista de palabras y hacer que aparezcan sólo las que coincidan con lo que vamos escribiendo al presionar la tecla TAB.

El código quedaría como sigue:

#!/usr/bin/python
#-*- coding: utf-8 -*-

import readline

readline.parse_and_bind("tab: complete")

def complete(text, state):
    """
        función llamada por readline para completar el texto escrito
    """
    # Lista de posibilidades
    posibilidades = ["arbol", "balón", "bolsa", "calma", "calavera", "cereza", "vino"]
    
    # Encontramos las coincidencias
    results = [x for x in posibilidades if x.startswith(text)] + [None]
    
    return results[state]

# Se cambia la función de completar por la propia
readline.set_completer(complete)

entrada = raw_input('rctorr> ')

print entrada

El resultado es fantástico, si presiono TAB dos veces sin escribir nada obtengo la lista de todas las opciones posibles, si escribo “a” y luego presiona TAB se comleta la palabra árbol porque es la única coincidencia, para “b” aparecen las posibilidades, igual que para “c”.
autocompletado-04

Fantástico!

Que tal si la lista tiene 3500 como el caso de un campo de tipo ID

Este podría ser un caso donde el ID tiene aproximadamente unos 3500 registros, entonces como procesaría readline la información, aquí el código

#!/usr/bin/python
#-*- coding: utf-8 -*-

import readline

readline.parse_and_bind("tab: complete")

def complete(text, state):
    """
        función llamada por readline para completar el texto escrito
    """
    # Lista de posibilidades
    posibilidades = []
    for x in range(3500):
        posibilidades.append("%06d"%(x,))
    
    # Encontramos las coincidencias
    results = [x for x in posibilidades if x.startswith(text)] + [None]
    
    return results[state]

# Se cambia la función de completar por la propia
readline.set_completer(complete)

while True:
    entrada = raw_input('rctorr> ')

print entrada

El resultado al escribir un 0 y luego presionar TAB es algo lento, incluso pensaría que no está funcionando, tiempo después se muestran todas las posiblidades, pero es algo lento y me parece que no es funcional.
autocompletado-05

Conclusiones

El módulo readline es bueno para listas de opciones talves no mayores a 1000, en caso contrario sería mejor buscar otra opción.

Por otro lado con listas de posibilidades menores funciona muy bien y ayudaría a no escribir mucho por parte del usuario y sobre todo a que la información que escriban sea la correcta, esto ayudaría a disminuir los dolores de cabeza tanto para el usuario como para el área de sistemas, que nooooo!!

Salu2+ y Buen inicio de año en este primer post del 2013!

  1. Aún no hay comentarios.
  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

PiKon

3D Printing + Raspberry Pi Camera = PiKon Telescope

gvSIG blog

gvSIG project blog

Python Adventures

Welcome to the Jungle!

A %d blogueros les gusta esto: