[EMAIL PROTECTED] wrote:

> So as you say, I could do:
> x=eval(x), y=eval(y), z=eval(z) and finally eval("z+y+x") but the
> problem is that the initial strings are in no particular order, so I
> don't know the sequence in which to perform the first 3 evaluations. I
> was wondering if there was a simple way to 'pattern-match' so that the
> required substitutions like z->x+y->x+x*a->(a+b)+(a+b)*a could be done
> automatically.
> 
Sounds a bit of an odd thing to do, but:

>>> def evaluate(var, names):
        expr = names[var]
        names['__builtins__'] = {}
        if isinstance(expr, basestring):
                del names[var]
                code = compile(expr, "<%s>"%var, "eval")
                for v in code.co_names:
                        evaluate(v, names)
                names[var] = eval(code, names, names)
                del names['__builtins__']
        return names[var]

>>> names = { 'a': 3, 'b': 2, 'x': 'a+b', 'y': 'x*a', 'z': 'x+y' }
>>> evaluate('z', names)
20
>>> names
{'a': 3, 'b': 2, 'y': 15, 'x': 5, 'z': 20}
>>> 

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to