对python装饰程序感到困惑。什么时候/怎样称呼他们?
有人能解释一下下面的代码片段吗?语法对python装饰程序感到困惑。什么时候/怎样称呼他们?,python,decorator,Python,Decorator,有人能解释一下下面的代码片段吗?语法@memoize让我有点困惑。什么时候/怎么叫?它有什么作用 import functools def memoize(fn): known = dict() @functools.wraps(fn) def memoizer(*args): if args not in known: known[args] = fn(*args) return known[args]
@memoize
让我有点困惑。什么时候/怎么叫?它有什么作用
import functools
def memoize(fn):
known = dict()
@functools.wraps(fn)
def memoizer(*args):
if args not in known:
known[args] = fn(*args)
return known[args]
return memoizer
@memoize
def fibonacci(n):
'''Returns the nth number of the Fibonacci sequence'''
assert(n >= 0), 'n must be >= 0'
return n if n in (0, 1) else fibonacci(n-1) + fibonacci(n-2)
if __name__ == '__main__':
print(fibonacci(10))
是同一件事吗
def fibonacci(n):
...
fibonacci = memoize(fibonacci)
有关装饰器如何工作的详细说明,请参见
是同一件事吗
def fibonacci(n):
...
fibonacci = memoize(fibonacci)
有关装饰器如何工作的详细说明,请参阅。它是在代码加载期间调用的。这与拥有:def fibonacci(n)是一样的:#etc pass fibonacci=memoize(fibonacci)你对一般的装饰器还是memoize感到困惑吗?我这样问是因为你基本上是在问,“这段代码是做什么的?”这太宽泛了。网上有很多资源解释装饰器,还有一个关于记忆化的问题。
memoize
缓存斐波那契计算的值。如果之前计算过这些值,它会从dictknown
返回它们,并且不会重新计算它们。我对调用函数memoize
的时间和方式感到非常困惑。我读了很多次decorators文档,但语言不是非常清晰(至少对我来说不是)。@AlexDicianu通过使用@memoize
装饰fibonacci
实际上是将fibonacci名称/变量绑定到memoize(fibonacci)
返回的函数。因此,每次调用fibonacci
时,都会“隐式”调用memoizer
,而定义fibonacci
时,会调用一次memoize
。这与拥有:def fibonacci(n)是一样的:#etc pass fibonacci=memoize(fibonacci)你对一般的装饰器还是memoize感到困惑吗?我这样问是因为你基本上是在问,“这段代码是做什么的?”这太宽泛了。网上有很多资源解释装饰器,还有一个关于记忆化的问题。memoize
缓存斐波那契计算的值。如果之前计算过这些值,它会从dictknown
返回它们,并且不会重新计算它们。我对调用函数memoize
的时间和方式感到非常困惑。我读了很多次decorators文档,但语言不是非常清晰(至少对我来说不是)。@AlexDicianu通过使用@memoize
装饰fibonacci
实际上是将fibonacci名称/变量绑定到memoize(fibonacci)
返回的函数。因此,每次调用fibonacci
时,都会“隐式”调用memoizer
,而在定义fibonacci
fibonacci=memoize(fibonacci)
时,fibonacci=memoize(fibonacci)
会调用一次,没有了争论,我更新了我的答案。