実行時にユーザーが入力する"sin(x)*x^2"
などの文字列を(簡単に)取得し、x
の任意の値を評価できるPython関数を生成する方法?
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 も参照してください。
J.F.セバスチャンのアドバイスを強調するために、「eval」および「コンパイラ」のソリューションでさえ、微妙なセキュリティホールに対処することができます。入力はどの程度信頼できますか? 'compiler'を使用すると、少なくともASTからgetattrルックアップなどをフィルターで除外できますが、Python助けて。
また、「コンパイラ」は不格好で使いにくいです。 3.0では非推奨で削除されています。 'ast'モジュールを使用する必要があります(2.6で追加、2.5では '_ast'として使用可能)。
Vartecと合意。私はSymPyを使用します-特にlambdify関数はあなたが望むものを正確に実行するはずです。
参照: http://showmedo.com/videotutorials/video?name=7200080&fromSeriesID=72
これの非常に素晴らしい説明のために。
ご多幸を祈る、
Sage は、MATLABの代替として意図されており、 intro videos では、ケースにどのように対応するかが示されています。彼らは幅広いアプローチをサポートしているようです。コードはオープンソースであるため、作成者がこのようなケースをどのように処理するかを参照して確認することができます。