在最近的一期Hacker Newsletter中,链接了这篇关于 Python 装饰器的非常有用的文章。我喜欢这篇文章,并且我认为我理解了大部分装饰器示例。但是,在非装饰器记忆示例中,我对代码感到非常困惑:
def memoize(fn):
stored_results = {}
def memoized(*args):
try:
# try to get the cached result
return stored_results[args]
except KeyError:
# nothing was cached for those args. let's fix that.
result = stored_results[args] = fn(*args)
return result
return memoized
我对这个函数如何创建一个stored_results
附加的持久字典感到困惑。重新阅读后,将其复制/粘贴到我的编辑器中并使用它,并在网上寻求帮助,我仍然不明白语法stored_results[args] = fn(*args)
的真正作用。
(1) 文章建议上述代码将返回函数,但现在它会先搜索字典,然后再执行新参数。这是怎么发生的?为什么不stored_results
只是本地的memoize
?为什么它在memoized
返回时不会被销毁?
(2) 链接到其他问题或网络资源来解释此处传递的论点*args
也会有所帮助。如果*args
是一个参数列表,为什么我们可以使用语法 stored_results[args]
,当您尝试在列表中索引字典时通常会遇到不可散列的错误?
感谢任何澄清的想法。