cmd all commands method?

P

placid

Hi all,

if i want to treat every cmdloop prompt entry as a potential command
then i need to overwrite 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


Cheers
 
P

placid

placid said:
Hi all,

if i want to treat every cmdloop prompt entry as a potential command
then i need to overwrite 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 should have been,

sum res 5
 
B

Bjoern Schliessmann

placid said:
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?

Regards,


Björn
 
P

Peter Otten

placid said:
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
 
P

placid

Have you ever written an interpreter? It is a nontrivial job.

Michele Simionato

No i have never written an interpreter and i can just imagine how much
work/effort is needed to write something like that.

If anyone can provide a suggestion to replicate the following Tcl
command in Python, i would greatly appreciate it.

namespace eval foo {
variable bar 12345
}

what this does is create a namespace foo with the variable bar set to
12345.

http://aspn.activestate.com/ASPN/docs/ActiveTcl/8.4/tcl/TclCmd/variable.htm

The code provided by Peter Otten is a good start for me. Cheers for
that!


Cheers
 
G

Gabriel Genellina

If anyone can provide a suggestion to replicate the following Tcl
command in Python, i would greatly appreciate it.

namespace eval foo {
variable bar 12345
}

what this does is create a namespace foo with the variable bar set to
12345.

Python namespaces are simple dictionaries. See the eval function.

py> s = "3+x**2"
py> freevars = {"x": 2}
py> eval(s, {}, freevars)
7
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,432
Messages
2,571,680
Members
48,796
Latest member
Greg L.

Latest Threads

Top