正如 NPE 所说,这里的正确答案是为您的表达式语言编写一个解析器(和简单的解释器)。
或者,更好的是,如果可能的话,首先在 Python 中生成表达式,而不是使用与 Python 的子集几乎但不完全兼容的语言。
或者,更好的是,如果该语言只是表示多项式系数列表的一种方式,只需将其表示为系数列表,这将比任何实际的通用语言更容易解析。例如,假设数据库保存了这个:
2.128795454425367, 208.54359721863273, 26.098128487929266, 3.34369909584111, -0.3450228278737971, -0.018630757967458885, 0.0015029038553239819
然后,要在 Python 中执行它,你可以这样做:
def eval_polynomial(polynomial, value):
coefficients = [float(x.strip()) for x in polynomial.split(',')]
return sum(coefficient * (value**exponent)
for exponent, coefficient in enumerate(coefficients))
然后:
>>> [eval_polynomial(expr, t) for t in range(1, 13)]
但是,如果您真的非常想在不更改数据库中的内容的情况下执行此操作,则可以将其转换为 Python 表达式并对其进行评估:
>>> expr = 'f(t)=(2.128795454425367)+(208.54359721863273)*t+(26.098128487929266)*t^2+(3.34369909584111)*t^3+(-0.3450228278737971)*t^4+(-0.018630757967458885)*t^5+(0.0015029038553239819)*t^6;'
>>> removef = re.sub(r'f\((\w+)\)=', 'lambda \1: ', expr)
>>> fixpower = re.sub(r'(\w+)\^(\d+)', r'(\1**\2)', removef)
>>> nosemi = fixpower.replace(';', '')
>>> func = eval(nosemi)
>>> [func(t) for t in range(1, 13)]
[239.75206957484252, 544.337732955938, 921.544112756058, 1366.6221363666925, 1864.8848673959649, 2393.2591324279497, 2922.9192385578326, 3423.0027817028927, 3865.4085456893295, 4230.676492114911, 4514.949840987468, 4738.019242139209]
但同样,您可能不想这样做。
而且,如果你这样做了,你可能想编写一个适用于你的实际语言的转换器,而不是基于一个例子对你的语言进行暗中猜测......</p>