1

MyClass多くのシミュレーション データを含むクラスを作成しました。このクラスは、類似した構造を持つさまざまなシミュレーションのシミュレーション結果をグループ化します。結果はMyClass.get(foo)メソッドで取得できます。これは、simulationID/配列のペアを持つ辞書を返します。配列はfoo各シミュレーションの値です。

今、クラスにメソッドを実装して、任意の関数をすべての配列に適用したいと考えていますfoo。これは、simulationID/function(foo) のペアを含む辞書を返す必要があります。

追加の引数を必要としない関数の場合、次の解決策が非常に満足のいくものであることがわかりました (コメントはいつでも歓迎します :-) ):

def apply(self, function, variable):
    result={}
    for k,v in self.get(variable).items():
        result[k] = function(v)
    return result

ただし、追加の引数を必要とする関数の場合、エレガントな方法でそれを行う方法がわかりません。典型的な操作は と を のような x 値として統合fooすることで、 と の両方をで取得できます。barnp.trapz(foo, x=bar)foobarMyClass.get(...)

私はこの方向で考えていました:

def apply(self, function_call):
    """
    function_call should be a string with the complete expression to evaluate
    eg: MyClass.apply('np.trapz(QHeat, time)')

    """
    result={}
    for SID in self.simulations:
        result[SID] = eval(function_call, locals=...)

    return result

問題は、ローカル マッピング オブジェクトを渡す方法がわからないことです。あるいは、間違った方向を見ているのかもしれません。よろしくお願いいたします。

ロエル

4

2 に答える 2

2

2 つの方法があります。最初はfunctools.partialを使用することです:

foo = self.get('foo')
bar = self.get('bar')
callable = functools.partial(func, foo, x=bar)
self.apply(callable, variable)

2 番目のアプローチは、パーシャルで使用されるのと同じ手法を使用することですが、任意の引数リストを受け入れる関数を定義できます。

def apply(self, function, variable, *args, **kwds):
    result={}
    for k,v in self.get(variable).items():
        result[k] = function(v, *args, **kwds)
    return result

どちらの場合も、関数のシグネチャは変更されないことに注意してください。どちらを選択するかはわかりませんが、最初のケースかもしれませんが、あなたが取り組んでいる状況がわかりません。

于 2012-05-10T16:37:05.337 に答える