cmd all commands method?
Peter Otten
__peter__ at web.de
Sun Feb 18 04:58:55 EST 2007
placid wrote:
> On Feb 18, 7:17 pm, "Michele Simionato" <michele.simion... at gmail.com>
> wrote:
>> On Feb 17, 11:44 pm, Bjoern Schliessmann <usenet-
>>
>>
>>
>> mail-0306.20.chr0n... at spamgourmet.com> wrote:
>> > placid wrote:
>> > > if i want to treat every cmdloop prompt entry as a potential
>> > > command then i need to overwrite the default() method ?
>>
>> > Excuse me, what's a cmdloop prompt? What's the "default() method"?
>>
>> > > What i want to achieve is to be able to support global variable
>> > > creation for example;
>>
>> > > res = sum 1 2
>>
>> > > this would create a variable res with the result of the method
>> > > do_sum() ?
>>
>> > > then would i be able to run;
>>
>> > > sum a 5
>>
>> > > this would return 8 or an error saying that res is not defined
>>
>> > Are you sure you're talking about Python here?
>>
>> Yes, he is talking about the cmd
>> module:http://docs.python.org/dev/lib/Cmd-objects.html. However that
>> module was never intended as a real interpreter, so defining variables
>> as the OP wants would require some work.
>>
>> Michele Simionato
>
> How much work does it require ?
Too much. However, here's how far I got:
import cmd
import shlex
DEFAULT_TARGET = "_"
def number(arg):
for convert in int, float:
try:
return convert(arg)
except ValueError:
pass
return arg
class MyCmd(cmd.Cmd):
def __init__(self, *args, **kw):
cmd.Cmd.__init__(self, *args, **kw)
self.namespace = {}
self.target = DEFAULT_TARGET
def precmd(self, line):
parts = line.split(None, 2)
if len(parts) == 3 and parts[1] == "=":
self.target = parts[0]
return parts[2]
self.target = DEFAULT_TARGET
return line
def resolve(self, arg):
args = shlex.split(arg)
result = []
for arg in args:
try:
value = self.namespace[arg]
except KeyError:
value = number(arg)
result.append(value)
return result
def calc(self, func, arg):
try:
result = self.namespace[self.target] = func(self.resolve(arg))
except Exception, e:
print e
else:
print result
def do_sum(self, arg):
self.calc(sum, arg)
def do_max(self, arg):
self.calc(max, arg)
def do_print(self, arg):
print " ".join(str(arg) for arg in self.resolve(arg))
def do_values(self, arg):
pairs = sorted(self.namespace.iteritems())
print "\n".join("%s = %s" % nv for nv in pairs)
def do_EOF(self, arg):
return True
if __name__ == "__main__":
c = MyCmd()
c.cmdloop()
Peter
More information about the Python-list
mailing list