python - 使用装饰器在定义的函数上产生 NameError

标签 python python-decorators

为什么会这样:

def fn(proc, *args, **kwargs):
    cache = proc.cache = {}
    def cached_execution(cache, *args, **kwargs):
        if proc in cache:
            if args in cache[proc]:
                return cache[proc][args]
        res = proc(args)
        cache[proc] = {args: res}
        return res
    return cached_execution(cache, proc, *args, **kwargs)

@fn
def cached_fibo(n):
    if n == 1 or n == 0:
        return n
    else:
        return cached_fibo(n-1) + cached_fibo(n-2)

print cached_fibo(100)

抛出这样的异常:

NameError: global name 'cached_fibo' is not defined

我缺少什么基本概念?

(从概念上讲,**kwargs 仅用于装饰。不用于检索缓存结果,但不用担心)。

最佳答案

装饰器应该返回一个函数,而不是调用函数的结果。 但这会导致我们犯下一个错误:当您将 cacheproc 传递给 cached_execution 函数时,它们会落在 *args< 中 又被传递给 proc。这没有道理。只需让 cacheproc 在内部方法中被捕获即可:

def fn(proc, *args, **kwargs):
    cache = proc.cache = {}
    def cached_execution(*args, **kwargs):
        if proc in cache:
            if args in cache[proc]:
                return cache[proc][args]
        res = proc(*args)
        cache[proc] = {args: res}
        return res
    return cached_execution

另一个问题:您没有解压args。您应该调用 proc(*args) 而不是 proc(args) (上面已修复)。

关于python - 使用装饰器在定义的函数上产生 NameError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32229767/

相关文章:

python - 将 .csv 文件从 URL 读取到 Python 3.x - _csv.Error : iterator should return strings, 不是字节(您是否以文本模式打开文件?)

python - 有没有办法使用 python 在 Pandas DataFrame 中使用行索引范围选择列的特定部分

python - 如何从 Python 列表中删除字符串元素中的前导零

python - 如何将 @retry 与关键字参数一起使用并传递函数

python-3.x - 如何键入注释多级装饰器

Python - 装饰器调用内部函数?

python - 如何在Python3中合并两个不相等的输入/列表

python - pymc3 和信念的线性回归

python - 在类中初始化装饰器变量

python - 类方法上的条件属性装饰器