试图实现一个Python装饰器,卡在几个地方

时间:2013-10-19 05:18:40

标签: python python-decorators

我目前正在学习装饰器,这个例子应该是一个保存递归fibonacci函数结果的基本装饰器,但我有几个问题。首先是“fn”,这只是变量的名称吗?或者它是python语言的一部分。 “KeyError”的问题相同。我也不明白为什么在函数体内,args有时会在前面有*而其他时候没有(不应该总是有*)

def memoize(fn):
    stored_results = {}

    def memoized(*args):
        try:
            return stored_results[args]
        except KeyError:
            result = stored_results[args]=fn(*args)
            return result
return memoized

def fibonacci(n):
    if n == 0 or n == 1:
        return n
    else:
        return (fibonacci(n-1)+fibonacci(n-2))


@memoize
fibonacci(5)

1 个答案:

答案 0 :(得分:0)

  1. 缩进正确。

    def memoize(fn):
        stored_results = {}
    
        def memoized(*args):
            try:
                return stored_results[args]
            except KeyError:
                result = stored_results[args]=fn(*args)
                return result
        return memoized
    #^^^
    
  2. @memoize应该在def ...行之前。

    @memoize # <-- should be here
    def fibonacci(n):
        if n == 0 or n == 1:
            return n
        else:
            return (fibonacci(n-1)+fibonacci(n-2))
    
  3. 只需拨打fibonacci,不要@memoize

    fibonacci(5)
    

  4.   

    首先是“fn”,这只是一个变量的名称吗?

    一个功能对象。这是fibonacci函数。

      

    'KeyError'的相同问题

    如果参数没有以前记忆的值,stored_results[args]会引发KeyError。 (TypeError如果您传递不可用的值作为参数)。

      

    我也不明白为什么在函数体中,args有时会在前面有一个*

    使memoize装饰器与另一个可能带有多个参数的函数一起工作。