web-dev-qa-db-ja.com

Python

実行時にユーザーが入力する"sin(x)*x^2"などの文字列を(簡単に)取得し、xの任意の値を評価できるPython関数を生成する方法?

39
WalkingRandomly

Python表記法を使用すると、Python独自の内部コンパイラがこれを解析できます。

表記を少し変更すると、より幸せになります。

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

処理できる抽象構文ツリーを取得します。

46
S.Lott

Python parser

import parser
formula = "sin(x)*x**2"
code = parser.expr(formula).compile()

from math import sin
x = 10
print eval(code)

純粋なevalよりもパフォーマンスが良く、もちろんコードインジェクションを回避できます。

31
Don
 f = parser.parse('sin(x)*x^2').to_pyfunc()

parserは、PLY、pyparsing、組み込みのトークナイザー、パーサー、astを使用して定義できます。

ユーザー入力にevalを使用しないでください。

14
jfs

特に文字列が信頼できないソースからのものである場合、pyparsingはあなたが望むことを行うかもしれません( http://pyparsing.wikispaces.com/ )。

それを使って構築されたかなりフル機能の計算機については、 http://pyparsing.wikispaces.com/file/view/fourFn.py も参照してください。

7
cryo

J.F.セバスチャンのアドバイスを強調するために、「eval」および「コンパイラ」のソリューションでさえ、微妙なセキュリティホールに対処することができます。入力はどの程度信頼できますか? 'compiler'を使用すると、少なくともASTからgetattrルックアップなどをフィルターで除外できますが、Python助けて。

また、「コンパイラ」は不格好で使いにくいです。 3.0では非推奨で削除されています。 'ast'モジュールを使用する必要があります(2.6で追加、2.5では '_ast'として使用可能)。

2
Andrew Dalke

Vartecと合意。私はSymPyを使用します-特にlambdify関数はあなたが望むものを正確に実行するはずです。

参照: http://showmedo.com/videotutorials/video?name=7200080&fromSeriesID=72

これの非常に素晴らしい説明のために。

ご多幸を祈る、

1
Geddes

Sage は、MATLABの代替として意図されており、 intro videos では、ケースにどのように対応するかが示されています。彼らは幅広いアプローチをサポートしているようです。コードはオープンソースであるため、作成者がこのようなケースをどのように処理するかを参照して確認することができます。

0
SilentGhost