代码之家  ›  专栏  ›  技术社区  ›  WalkingRandomly

python中的公式解析

  •  34
  • WalkingRandomly  · 技术社区  · 16 年前

    我怎样才能(轻易地)把一根绳子 "sin(x)*x^2" 它可以由用户在运行时输入并生成一个python函数,该函数可以对 x ?

    7 回复  |  直到 8 年前
        1
  •  47
  •   S.Lott    16 年前

    如果使用python符号,python自己的内部编译器就可以解析它。

    如果你稍微改变一下符号,你会更高兴的。

    import compiler
    eq= "sin(x)*x**2"
    ast= compiler.parse( eq )
    

    您可以使用一个抽象语法树。

        2
  •  28
  •   Don    8 年前

    你可以用蟒蛇 parser :

    import parser
    formula = "sin(x)*x**2"
    code = parser.expr(formula).compile()
    
    from math import sin
    x = 10
    print eval(code)
    

    它的性能比纯的好 eval 当然,还要避免代码注入!

        3
  •  14
  •   jfs    16 年前
     f = parser.parse('sin(x)*x^2').to_pyfunc()
    

    在哪里? parser 可以使用ply、pyparsing、builtin tokenizer、parser、ast定义。

    不要使用 eval 用户输入。

        4
  •  7
  •   cryo    15 年前

    Pyparsing可能会满足您的需要( http://pyparsing.wikispaces.com/ )尤其是如果字符串来自不受信任的源。

    也见 http://pyparsing.wikispaces.com/file/view/fourFn.py 一个功能齐全的计算器。

        5
  •  2
  •   Andrew Dalke    16 年前

    为了强调J.F.Sebastian的建议,“eval”甚至“compiler”解决方案都可能存在细微的安全漏洞。输入的可信度如何?使用“compiler”,你至少可以从ast中过滤出getattr查找之类的内容,但我发现,对于这类内容,使用ply或pyparsing比确保让python提供帮助的结果更容易。

    另外,“编译器”既笨拙又难以使用。它在3.0中被弃用并删除。您应该使用“ast”模块(在2.6中添加,在2.5中可用作“ast”)。

        6
  •  1
  •   Geddes    15 年前

    与Vartec达成协议。我会使用sympy——特别是lambdafiy函数应该完全按照您的要求执行。

    见: http://showmedo.com/videotutorials/video?name=7200080&fromSeriesID=720

    对于这件事的一个很好的解释。

    最美好的祝福,

        7
  •  0
  •   SilentGhost    16 年前

    Sage 作为Matlab的替代品 intro videos 它演示了如何处理类似于您的案件。它们似乎支持各种各样的方法。由于代码是开放源码的,您可以自己浏览并查看作者如何处理此类情况。