2011-08-03 12 views
4

解決する方程式をユーザーが提出できるシステムをセットアップしようとしています。私は問題の完全なパラメータ化を表すクラスDPを持っています。異なるクラスdpsolverはdpオブジェクトをとり、行列を構築し、問題を解決します。Python:評価関数を使用せずに動的に関数の引数を生成する方法

DPオブジェクトを作成する場合、属性の一つは、機能は、このような関数の基準である:

def equation1(r, tx, p, p_prime, k, k_prime, z, z_prime): 
    """ it is assumed all arguments are same sized ndarray or scalar""" 
    inv = k_prime - 0.8 * k 
    v = np.power(z_prime * inv, 0.75) * (1-tx) - p*tx + p_prime 
    return(v) 

RおよびTXはDPオブジェクトに定義されたスカラーです。 p、p_prime、k、k_prime、z、z_primeはすべて、DPクラスのインスタンス化に含まれる他の情報に基づいて構築されたnumpy行列です。 DPクラスには、p、k、およびzをキーとして(その順序で)持つOrderedDictが含まれています。 p_prime、k_prime、z_primeはすべてソルバーによって推論されます。私の質問は、ソルバーからequation1関数を呼び出す正しい方法は何でしょうか。できるだけシンプルにしたいので、他の人がこのシステムに簡単に統合できる方程式を提出することができます。

私は、evalを使うとリストが使えると思っていたし、evalを使って式1の中でリストを展開することを考えていた。 evalを使用せずにこれを行う最善の方法は何ですか?それとも、パフォーマンス面ではevalが大丈夫でしょうか?

+0

私は混乱しています。どのようにして*あなたが定義した引数でその関数を呼び出すことはできませんか? – SingleNegationElimination

答えて

3

あなたの質問から:

代わりにリストを使用して、あなたは非常によく、すでにこのことを認識かもしれませんが、場合にあなたがいるequation1

以内リスト を解凍するためにeval使用電話番号:

equation1(*list_of_parameters) 

これだけですか?

equation1(**dict_of_parameters) 

をやっ同様

は、引数をキーワードに辞書を拡大していきます。

エバールは理由がありますが、メタプログラミングに使用することはしばしば悪い考えです。

+0

ああ、ありがとう。私はこれを知らなかった。これが私の最初のPythonプロジェクトです。助けてくれてありがとう。この機能とは何ですか? – stevejb

+0

@stevejb - まあ、正直なところ、私は分かっていない... "パラメータの拡張"おそらく?私は実際には、実際にそれを "本物の"名前を横切って実行したかどうかわからない... –

+1

@stevejb:これのための特別な用語に最も近いものは、あなたの質問のテキストですでに使用している単語です:*開梱*。公式のPythonのドキュメントのチュートリアルの4.7.4節を参照してください。 –

関連する問題