2012-04-01 5 views
0

私はeval()を理解しようとしていますが、運があまりありません。ユーザー提供の統合機能に "eval"を使用していますか?

私は自分の数学ライブラリを作成しており、ライブラリに統合を組み込もうとしています。 Pythonに関数を一連の変数、定数、演算子として認識させる助けが必要です。私はevalがトリックをするだろうと言われましたが、私はそれについてどうやって行くのですか?

fofx = input ("Write your function of x here >") 
def integrate (fofx): 
    #integration algorithm here 
    #input fofx and recognize it as f(x) to be integrated. 

私はドキュメントを試してみましたが、それは限られていると私は評価したい私の関数にそれを適用できるか見当もつかない。

+3

'eval'はここでは役に立ちません。 ['ast'](http://docs.python.org/py3k/library/ast.html"抽象構文木 ") –

+2

あなたの質問は何ですか? – Marcin

+0

http://docs.python.org/library/functions.html#evalには制限がありますか?このリンクについて不明な点は何ですか? – Simon

答えて

4

eval()のドキュメントは私の見解ではっきりしており、必要なものの合理的な例を示しています。

基本的には文字列に評価される式を開催したい:

>>> f = 'x**2 + 2*x' 

次にあなたがxの値を定義することができます。最後に

>>> x = 3 

し、評価を呼び出す:

>>> eval(f) 
15 

また、evalへの呼び出しをより制御したい場合は、 xという名前のローカル変数を作成し、その後、あなたはeval()にパラメータで評価環境に渡すことができます。

>>> f = 'x**2 + 2*x' 
>>> eval(f, {}, {'x': 5}) 
35 

あなたは評価環境を制御したい理由は、不注意で使用されているプログラムで定義されたすべての変数を避けるためです評価。

+1

または、いくつかのジョーカーが "xの関数"をインポートしようとしないようにするには、import sys; sys.exit() ' –

+2

@ Li-aungYip入力をevalに制約することは、そのような悪用を止めることはありません。私はこれが個人的なプロジェクトであり、悪質な入力についての心配は単純に無視できると仮定しています。 –

+0

幼い頃に防衛プログラミングを教えるのが最善です。今日の 'eval()'のユーザーは明日の '' SELECT * FROM table WHERE column =%s "%user_input'のユーザーです。 –

1

多分あなたは抽象構文木モジュールの 'eval'モードを考えているかもしれません。これは、単一の式の構文木を構成することを可能にします。

たとえば、以下のコードでは、文字列内の式が使用され、 'x ** 2 + 3 * x ** 4 + 2'が 'x ** 3 + 3 * x ** 5' +2 'となる。 (そのコードがはるかに長くなり、これは表現の不可欠ではないことに注意!)

import ast 

class IncreasePower(ast.NodeTransformer): 
    def visit_BinOp(self,node): 
     node=self.generic_visit(node) 
     if isinstance(node.op , ast.Pow) and isinstance(node.right, ast.Num): 
      node.right.n+=1 
     return node 

x=4 
s='x**2+3*x**4+2' 
print eval(s) 

A = ast.parse(s,'source','eval') 
B = IncreasePower().visit(A) 
E = compile(A,'increased','eval') 

print eval(E) 

あなたはまた、それが役に立つ表現を構築する別のアプローチを使用して、シンボリック数学ライブラリsympyを見て見つけることが。 sympyでは、式を構築する前にx = sympy.Symbol( "x")で始まります。

"sympy.integrate"関数はシンボリックな統合を行います。

+0

非常に良い答え!私に「ast」を詳しく学びたいと思うようになる。 –

関連する問題