faretesto > comp.lang.* > comp.lang.python

Andrea Crotti (26.05.2010, 13:55)
Tempo fa mi ricordavo di un modo molto carino e pulito per creare
semplici programmini interattivi che auto-completassero l'input da
utente, ma naturalmente non lo trovo più...

Quindi spulciando un po' ho fatto questo

--8<---------------cut here---------------start------------->8---

#!/usr/bin/env python

import rlcompleter
import readline

ns = {
"a" : "abc",
"ab" : "abc"
}

c = rlcompleter.Completer(ns)

readline.set_completer(c.complete)
readline.parse_and_bind("tab: complete")

input("insert something\n")
--8<---------------cut here---------------end--------------->8---

Che per esempio mi sembra funzionare, solo che:
1. per quale motivo devo dargli un dizionario se voglio solo prendere da
una lista?

2. cerca anche di completarmi su alcune cose definite da python tipo
--8<---------------cut here---------------start------------->8---
ArithmeticError( PendingDeprecationWarning( abs(
--8<---------------cut here---------------end--------------->8---

Nonostante io gli abbia dichiarato con cosa voglio completare...

Se ci sono modi più intelligenti (magari rimanendo nelle librerie
standard) ben vengano...
Andrea Crotti (26.05.2010, 14:27)
Per adesso ho fatto brutalmente una cosa di questo tipo:

--8<---------------cut here---------------start------------->8---

readline.parse_and_bind("tab: complete")
mote = input("which mote you want to inspect?\n")
# see if this is actually correct
c = rlcompleter.Completer(dict(zip(self.vars, self.vars)))
readline.set_completer(c.complete)
var = raw_input("which variable do you want to inspect\n")
print "mote %d:var %s = %s" % (mote, var, self.nodes[mote].getVariable(var).getData())
--8<---------------cut here---------------end--------------->8---

E funzionerebbe pure, però mi mostra sempre uns acco di roba in più...
Dubito che il dizionario che ho creato sia corretto, e non ho proprio
capito che caspita fa questo:

--8<---------------cut here---------------start------------->8---
readline.parse_and_bind("tab: complete")
--8<---------------cut here---------------end--------------->8---

Nella doc dicono
"Parse and execute single line of a readline init file."

Ma non è che mi abbia molto chiarito le idee, e perché mai prende una
stringa di quel tipo?
Grazie
Discussioni simili