计算python中字符串中的数学表达式

问题描述

我有一堆从 JSON file 加载的方程,我想评估这些表达式。这些表达式有一些常量,常量的值(K1,K2,...)也保存在json文件中。与表达式中存在的变量 (var1,var2 ...) 对应的值在字典 vars 中定义。我想在表达式中插入常量和变量的值并计算数值。

import json
vars = {"var1": 1,"var2": 2,"var3": 3,"var4": 4,"var5": 5,"var6": 5}
with open("tst.json",'r') as f:
     r = json.load(f)
     print(r)

json 内容:

{
  "EQ1": {
    "parameters": {
      "EQ1_coeff1": {
        "value": 1.0e-06
      },"P2": {
        "value": 3.0
      },"P3": {
        "value": 3.0
      }
    },"expression": "(EQ1_coeff1 * ((1 dimensionless)/(1 dimensionless)) / (1 dimensionless))*(var1^P3/(var1^P3 + P2^P3) )"
  },"EQ2": {
    "parameters": {
      "EQ2_coeff2": {
        "value": 5253
      },"K2": {
        "value": 3
      },"K5": {
        "value": 1
      },"K3": {
        "value": 525
      },"K4": {
        "value": 3
      },"K6": {
        "value": 2
      },"K7": {
        "value": 0.01
      }
    },"expression": "(EQ2_coeff2 *((var2*var3)/(K1*K2))* ((1 dimensionless - ((var3*var4)/(var2))/K6) / ((1 dimensionless + var1/K1)*(1 dimensionless + var2)+ 1 dimensionless)))*(1 dimensionless/(1 dimensionless + var5/K7))"
  }
}

我想就如何计算这些表达式(存储在 expression 中)征求建议。

附注:

1 dimensionless 只不过是 1。

解决方法

我将简单地用 globals() 更新 dict,然后使用 eval,如下所示:

import json
vars = {"var1": 1,"var2": 2,"var3": 3,"var4": 4,"var5": 5,"var6": 5}
r = {
  "EQ1": {
    "parameters": {
      "EQ1_coeff1": {
        "value": 1.0e-06
      },"P2": {
        "value": 3.0
      },"P3": {
        "value": 3.0
      }
    },"expression": "(EQ1_coeff1 * ((1 dimensionless)/(1 dimensionless)) / (1 dimensionless))*(var1^P3/(var1^P3 + P2^P3) )"
  },"EQ2": {
    "parameters": {
      "EQ2_coeff2": {
        "value": 5253
      },"K2": {
        "value": 3
      },"K5": {
        "value": 1
      },"K3": {
        "value": 525
      },"K4": {
        "value": 3
      },"K6": {
        "value": 2
      },"K7": {
        "value": 0.01
      }
    },"expression": "(EQ2_coeff2 *((var2*var3)/(K1*K2))* ((1 dimensionless - ((var3*var4)/(var2))/K6) / ((1 dimensionless + var1/K1)*(1 dimensionless + var2)+ 1 dimensionless)))*(1 dimensionless/(1 dimensionless + var5/K7))"
  }
}

globals().update( **{k:v['value'] for k,v in r["EQ1"]["parameters"].items()})
globals().update( **{k:v['value'] for k,v in r["EQ2"]["parameters"].items()})
globals().update(**vars)

eval(r['EQ1']['expression'].replace("dimensionless","").replace("^","**"))

这给出:3.571428571428571e-08

对于 EQ2,您没有定义变量 K1。这更像是一种黑客行为,但我不知道更优雅的方式。还要记住 eval 是一个不太安全的函数。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...