簡體   English   中英

Python:用於字典的生成器和裝飾器

[英]Python: Generators and decorators with for a dictionary

我創建了一個問題,該問題行使了一個人在Python中使用生成器,裝飾器和字典的能力。

但是,我自己無法解決此問題,並且想知道是否有可能解決。

是否可以使用包裝生成器的裝飾器函數以字典的形式緩存函數輸出?

練習是:

編寫裝飾器以緩存函數調用結果。 將對arg:result存儲在功能對象屬性的字典中。 使用生成器函數生成這些結果。在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

但是,出現以下錯誤:

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'

有人知道這樣的問題的替代解決方案嗎?

您的具體錯誤

錯誤在這里:

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

我想返回結果時要返回字典。 我不太了解您實際上在緩存功能中在哪里進行任何緩存。

普通的留言

這種緩存模式通常也稱為記憶。

試試這個http://avinashv.net/2008/04/python-decorators-syntactic-sugar/ 向下滾動到有關斐波那契的部分。 在此找到以下代碼:

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))

完整代碼

在您的示例中,記憶仍然可以在生成器上進行,請注意,打印語句顯示已獲取記憶的結果。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM