Python:用于字典的生成器和装饰器

2024-04-26 04:18:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个问题,它锻炼了一个人在Python中使用生成器、修饰符和字典的能力。在

然而,我自己解决不了这个问题,我想知道是否有可能解决这个问题。在

是否可以使用包装生成器的decorator函数以字典的形式缓存函数输出?在

练习是:

编写一个decorator来缓存函数调用结果。 存储对arg:导致函数属性中的字典 对象。使用生成器函数生成这些结果 在fibonacci函数上测试代码。

我试图实施如下:

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

但是,我得到了以下错误:

^{pr2}$

有人知道这样一个问题的另一种解决方法吗?在


Tags: 函数namedocreturn字典defargsdecorator
1条回答
网友
1楼 · 发布于 2024-04-26 04:18:46

您的特定错误

错误在这里:

return {func.__name__ + '(' + str(list(args))[1:-1] + ')' : str(result)}

当你想返回我相信的结果时,你就是在退字典。我不太明白你在缓存函数里面做什么缓存。在

一般评论

这种缓存模式通常也被称为记忆化。在

试试这个http://avinashv.net/2008/04/python-decorators-syntactic-sugar/。向下滚动到关于斐波那契的部分。可在此处找到以下代码:

^{pr2}$

然后简单地做:

@memoize
def fibonacci(n):
  assert n >= 0
  if n < 2:
    return n
  else:
    return (fibonacci(n-1) + fibonacci(n-2))

完整代码

在您的示例中,memorization仍然在生成器上工作,请注意print语句显示正在获取memorized结果。在

class memoize:
  def __init__(self, function):
    self.function = function
    self.func_name = function.__name__
    self.memoized = {}

  def __call__(self, *args):
    try:
      print "Using Memo Solution for " + self.func_name + " on " + str(args)
      return self.memoized[args]
    except KeyError:
      print "Computing Solution Now for " + self.func_name + " on " + str(args)
      self.memoized[args] = self.function(*args)
    return self.memoized[args]

@memoize
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

相关问题 更多 >