2010-12-08 15 views
3

私は回転のソリッドの音量を計算するプログラムを書いています。これの最初のステップは、積分を計算することです。私はこのためにscipy.integrateを使用していますが、私は方程式(例えば、コマンドラインでx=x**2入力のような最良の方法を見つけることができません。ラムダとしての機能を取る。残念ながら、​​は、引数の型としてラムダになりません、そしてラムダ(f = lambda x: args.equation)を構築するための文字列を使用しようとするだけで(当然のことながら、実際に)文字列を返します。関数を引数として取る方法は? (Python)

はここで私は「何ですこれまでに得たVEの:

import sys 
import argparse 
import math 
from scipy import integrate 

parser = argparse.ArgumentParser(description='Find the volume of the solid of rotation defined') 
parser.add_argument('equation', help='continous function') 
parser.add_argument('a', type=float, help='bound \'a\'') 
parser.add_argument('b', type=float, help='bound \'b\'') 
parser.add_argument('-axis', metavar='x|y', help='axis of revolution') 
args = parser.parse_args() 

def volume(func, a, b, axis=None): 
    integral = integrate.quad(func, a, b) 
    return scipy.py * integral 

print volume(args.equation, args.a, args.b) 

が何かアドバイスが理解されるであろう おかげ

答えて

6

セキュリティリスクについて全く心配は、ユーザの実行任意のPythonコードをさせるから存在しない場合、あなたはevalを使用することができます呼び出し可能オブジェクトを作成します。

volume(eval('lambda x: %s' % args.equation), args.a, args.b) 
+0

ありがとうございます。より安全な方法もありますか? –

+1

「安全」であるためには、許可する構文を正確に文書化し、パーサーを作成する必要があります。それはたくさんの仕事です。 –

2

あなたはあなたの引数から取得した文字列にeval()を使用することができるはずです。

>>> f = eval("lambda x: x**2") 
>>> f(5) 
25 
関連する問題