【问题标题】:Trying to implement a Python Decorator, stuck in a few places试图实现一个 Python 装饰器,卡在几个地方
【发布时间】:2013-10-28 01:32:39
【问题描述】:

我目前正在学习装饰器,这个例子应该是一个保存递归斐波那契函数结果的基本装饰器,但我有几个问题。首先是“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)

【问题讨论】:

    标签: python python-decorators


    【解决方案1】:
    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)
      

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

    一个函数对象。这里是fibonacci 函数。

    'KeyError' 同样的问题

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

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

    memoize 装饰器与另一个可以接受多个参数的函数一起工作。

    【讨论】:

    • 谢谢!而且我明白 args 表示多个参数,但我仍然不明白为什么在这个例子中,有时前面有一个星,有时没有
    • @user2897013,这取决于装饰器的用例。如果装饰器应该用于任意函数(参数可能不同),它使用*,如果它应该由具有固定参数的函数使用,它指定该参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 2011-03-08
    相关资源
    最近更新 更多