用AST python中的表达式中的实际值替换变量名称

阿努拉格·沙玛(Anurag Sharma)

我有一个这样的变量形式描述的表达式

's1*3 - (s2-s1)*1'

我给出了s1和s2的值,可以根据需要进行更改

我可以使用python ast模块通过替换相应的s1和s2值(s1 = 20,s2 = 30)来评估此表达式

import ast
import operator as op

operators = {ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul,
             ast.Div: op.truediv, ast.Pow: op.pow, ast.BitXor: op.xor,
             ast.USub: op.neg}

def eval_(node):
    if isinstance(node, ast.Num): # <number>
        return node.n
    elif isinstance(node, ast.BinOp): # <left> <operator> <right>
        return operators[type(node.op)](eval_(node.left), eval_(node.right))
    elif isinstance(node, ast.UnaryOp): # <operator> <operand> e.g., -1
        return operators[type(node.op)](eval_(node.operand))
    else:
    raise TypeError(node)

>>> str1 = '20*3 - (30-20)*1'
>>> node = ast.parse(str1, mode='eval')
>>> eval_(node.body)
50

我应该如何评估此表达式,而无需将变量替换为其实际值。

谢谢

卡斯拉文

您可以使用evalfunction。但是您必须谨慎使用,eval因为它会执行任何字符串,如果您接受从不可信输入中求值的字符串,可能会非常危险。例如,假设要评估的字符串是"os.system('rm -rf /')"它将真正开始删除计算机上的所有文件。

>>> eval('20*3 - (30-20)*1')
50 

作为更好的解决方案,您可以使用python的内部编译器解析方程式

>>> s1=20
>>> s2=30
>>> eq='s1*3 - (s2-s1)*1'
>>> compiler.parse( eq )
Module(None, Stmt([Discard(Sub((Mul((Name('s1'), Const(3))), Mul((Sub((Name('s2'), Name('s1'))), Const(1))))))]))

因此,如果您想评估方程式,input那么使用compile评估这个比使用更安全的方法

>>> eq='s1*3 - (s2-s1)*1'
>>> a=compile(eq,'','eval')
>>> eval(a)
50

您也可以将sympy其用作符号数学的Python库。它旨在成为一个功能齐全的计算机代数系统(CAS),同时保持代码尽可能的简单,以便于理解和易于扩展。SymPy完全用Python编写,不需要任何外部库。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

用 Python 函数中的正则表达式搜索的结果替换列表中的变量

用python中这些元素的值替换表达式中括号内的元素

用Python中的正则表达式替换

用Regex.Replace替换公式中的变量名称

用对象值替换字符串中匹配的正则表达式值

查找:用变量替换表达式

在sympy中运行表达式的AST

用变量替换文件内容中匹配的正则表达式

如何在Python抽象语法树(AST)中获取实际的用户定义变量名?

Python:用它的表达式替换函数,在数学表达式中作为字符串,用Sympy?

创建正则表达式以用单引号替换输入值中的href

用多个值替换表达式中的一个符号

用JavaScript中的正则表达式替换HTML属性值

用常量替换表达式中的参数

用R中的查询替换表达式参数

用数组替换 mongoDB 查询中的表达式

用正则表达式替换网址中的字符

用表达式中的一项替换大括号表达式

正则表达式用Python中的英文逗号替换中文标点符号

用Python的列表理解中的正则表达式替换

python中的正则表达式用句号替换以整数为界的逗号

用正则表达式替换python中两个标签周围的文本

用python中的正则表达式替换括号和括号后的单词

当我用变量替换硬编码值时,Python SQL查询返回“ ORA-00936:缺少表达式”

如何在literal_eval之前用Python AST中的dict替换OrderedDict?

用正则表达式递归.replace中的变量

如何在Julia中查找和替换AST的子表达式

如何用scalameta递归替换AST中的所有特定Term.Name表达式?

检索索引时,用dict中的值替换字符串中的正则表达式