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