Pythonは複雑な匿名関数をサポートしていません。良い選択肢は何ですか?例:python:匿名関数の代わりに
class Calculation:
def __init__(self, func):
self.func = func
def __call__(self, data):
try:
# check if the value has already been calculated
# if it has, it would be cached under key = self.func
return data[self.func]
except KeyError:
pass # first-time call; calculate and cache the values
data[self.func] = self.func(data)
return data[self.func]
# with a simple function, which can be represented using lambda, this works great
f1 = Calculation(lambda data : data['a'] * data['b'])
# with a complicated function, I can do this:
def f2_aux:
# some complicated calculation, which isn't suitable for a lambda one-liner
f2 = Calculation(f2_aux)
これは合理的な設計ですか?
もしそうなら、私がモジュールで定義する各f *のf * _auxの醜さを避ける方法はありますか?
UPDATE:使用の
例:
d = {'a' : 3, 'b' : 6}
# computes 3 * 6
# stores 18 in d under a key <function <lambda> at ...>
# returns 18
f1(d)
# retrieves 18 from d[<function <lambda> at ...>]
# returns 18, without having to recalculate it
f1(d)
がUPDATE:
ちょうど私の理解のために、私は内側の関数を使用したバージョンを追加しました。
def memoize(func):
def new_func(data):
try:
# check if the value has already been calculated
# if it has, it would be cached under key = self.func
return data[func]
except KeyError:
pass # first-time call; calculate and cache the values
data[func] = func(data)
return data[func]
return new_func
@memoize
def f1(data):
return data['a'] * data['b']
いいえ、これは合理的な設計ではありません。あなたはmemoization(これは匿名関数とは無関係です)をしているように見えます。 'f1 = lambda a:expression'は常に' def f1(a):return expression'と全く同じです。 [これは勉強するための良いメモデコレータです](http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize)。ところで、 '@decorator def function:pass'は常に' def function:pass;と全く同じです。 function = decorator(function) ' –
悪い点は、あなたのmemoizerが壊れていることです。結果キャッシュ 'data'はあなたの関数の引数でもあります... –
@FrancisAvila:辞書要素' data [f] 'に' f(data) 'の値をキャッシュしようとしました。他の関数の値が別のキーの下にキャッシュされるため、他のものとの競合も起こらないはずです。それは(技術的に)うまくいくようです。不必要に混乱しているコードの問題ですか? – max