типа a*3+b*(c+d)
причем a,b и т.д. не обязательно переменные python, это могут быть и поля таблицы БД
собрался было разбирать формулу, строить деревья…
Но обошелся малой кровью:
# -*- coding: utf-8 -*-
import re
class zzCalc():
dataDict={}#словарь для переменных
def userData(self, key):#метод для извлечения данных
return 0
def myCa(self, para):#вычислятор переменных
rez=0
try:
rez=eval(para)
except:
if self.dataDict.has_key(para):#
rez=self.dataDict[para]
else:
rez=self.userData(para)
finally:
return rez
def calc(self, expr): #расчет формулы
expr="+"+expr+"+"
oprs="[/\(\)\+\*\-\s]"
vars=re.split(oprs,expr)
for v in vars:#удалим все, что начинается с точки
if v<>"":
if v[0]==".": del vars[vars.index(v)]
for x in vars:
if x<>"":
d=re.findall("%s%s%s" % (oprs, x, oprs),expr)
for y in d:
newop=y.replace(x, "self.myCa('%s')" % x)
expr=expr.replace(y,newop)
expr=expr[1:-1]
rez=0
try:
rez=eval(expr)
finally:
return rez
####################################################
class uu():
d=12
def m(self, i=1): return i**2
def s(self, i=1): return "*io %s **" % i
def aa(p):return -p*64
u=uu()
def myData(para):
if para=="c":
return 1
else:
return 0
mc=zzCalc()
mc.userData=myData
mc.dataDict["a"]=1
mc.dataDict["b"]=1
proba113=95
print mc.calc("1+1*9/3+u.d")
print mc.calc("u.d+a*b*c")
print mc.calc("proba113")
print mc.calc("u.m(3)")
можно использовать для встроенного калькулятора…