用AST python中的表达式中的实际值替换变量名
发布时间:2020-12-20 11:38:24 所属栏目:Python 来源:网络整理
导读:我有一个像这样的变量形式描述的表达式 's1*3 - (s2-s1)*1' 我给出了s1和s2的值,可以根据需要改变 我可以使用python ast模块通过替换相应的s1和s2值来评估此表达式(s1 = 20,s2 = 30) import astimport operator as opoperators = {ast.Add: op.add,ast.Sub:
我有一个像这样的变量形式描述的表达式
'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 如何评估此表达式而无需将变量替换为其实际值. 谢谢 解决方法
您可以使用eval功能.但是你必须小心使用eval,因为它执行任何字符串,如果接受字符串从不受信任的输入进行评估,则可能非常危险.例如假设被评估的字符串是“os.system(‘rm -rf /’)”?它将真正开始删除您计算机上的所有文件.
>>> eval('20*3 - (30-20)*1') 50 作为一个更好的解决方案,您可以使用python的内部compiler解析您的等式: >>> 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))))))])) 因此,如果您想评估等式,比使用输入更安全,您可以使用编译和评估! >>> eq='s1*3 - (s2-s1)*1' >>> a=compile(eq,'','eval') >>> eval(a) 50 您也可以使用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |