我如何(轻松地)获取一个字符串,例如"sin(x)*x^2"
用户可能在运行时输入的字符串,并生成一个可以评估任何值的Python函数x
?
如果使用Python表示法,Python自己的内部编译器可以解析它.
如果你稍微改变符号,你会更快乐.
import compiler eq= "sin(x)*x**2" ast= compiler.parse( eq )
您将获得一个可以使用的抽象语法树.
你可以使用Python parser
:
import parser formula = "sin(x)*x**2" code = parser.expr(formula).compile() from math import sin x = 10 print eval(code)
它表现得比纯粹好eval
,当然也避免了代码注入!
f = parser.parse('sin(x)*x^2').to_pyfunc()
哪里parser
可以使用PLY,pyparsing,内置标记器,解析器,ast定义.
不要eval
在用户输入上使用.
pyparsing可能会做你想要的(http://pyparsing.wikispaces.com/),特别是如果字符串来自不受信任的来源.
另请参阅http://pyparsing.wikispaces.com/file/view/fourFn.py,了解使用它构建的功能完备的计算器.