Python でジェネレーター、デコレーター、辞書を使用する能力を試す問題を作成しました。
ただし、この演習を自分で解決することはできず、解決できるかどうか疑問に思っていました。
ジェネレーターをラップするデコレーター関数を使用して、関数出力を辞書の形でキャッシュすることは可能ですか?
演習は次のとおりです。
関数呼び出しの結果をキャッシュするデコレーターを作成します。関数オブジェクトの属性のディクショナリに arg:result のペアを格納します。ジェネレーター関数を使用してこれらの結果を生成する フィボナッチ関数でコードをテストします。
私は次のようにそれを実装しようとしました:
def cachefunc(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return {func.__name__ + '(' + str(list(args))[1:-1] + ')' : str(result)}
wrapper.__name__ = func.__name__
wrapper.__doc__ = func.__doc__
return wrapper
@cachefunc
def fibonacci(n):
assert n >= 0
if n < 2:
return n
else:
return (fibonacci(n-1) + fibonacci(n-2))
def allfib():
n = 0
while True:
yield fibonacci(n)
n += 1
result = []
generator = allfib()
while len(result) < 10:
x = next(generator)
result.append(x)
print result
ただし、次のエラーが表示されます。
python dg.py
Traceback (most recent call last):
File "dg.py", line 32, in <module>
x = next(generator)
File "dg.py", line 26, in allfib
yield fibonacci(n)
File "dg.py", line 10, in wrapper
result = func(*args, **kwargs)
File "dg.py", line 22, in fibonacci
return (fibonacci(n-1) + fibonacci(n-2))
TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
このような質問に対する別の解決策を知っている人はいますか?