在为装饰器赋值之前引用的局部变量

时间:2012-06-06 11:13:09

标签: python decorator

我正在使用带有函数语法的装饰器,如here所述。

我循环了一个dict列表。在这个循环中,我用一个带有参数的装饰器包装一个泛型函数。然后我用当前的dict作为参数调用包装函数。

我的问题是我收到local variable 'generic_evaluator' referenced before assignment错误。

这是我的代码:

有关装饰师:

def log(logfile_name):
    def inner_log(func):
        def wrapped(*args, **kwargs):
            import os
            ret = func()
            # business code...
        return wraps(func)(wrapped)
    return inner_log

这里是我用generic_evaluator装饰器包裹log函数的地方。

for evaluation in generic_evaluations:
    generic_evaluator = log(evaluation['suffix'])(generic_evaluator)
    generic_evaluator(evaluation['suffix'], evaluation['id'])

修改

此外,这段代码可能会更加清晰:

@tictoc
def generic_evaluator(suffix_url, id):
    xml = etree.parse(get_resource(base_url + "/" + suffix_url + "/" + str(id)))
    links = fetch_urls_from_xml(xml)
    return links

2 个答案:

答案 0 :(得分:2)

如果generic_evaluator是全局函数,并且您确实要重新绑定全局名称generic_evaluator,请将此名称声明为全局:

global generic_evaluator

如果您不想重新绑定全局名称,请使用其他本地名称并对其进行初始化:

local_generic_evaluator = generic_evaluator

This answer解释了发生了什么。

答案 1 :(得分:0)

generic_evaluator = log(evaluation['suffix'])(generic_evaluator)

您在此处分配之前引用generic_evaluator log(评估['后缀'])(generic_evaluator)

试试这个:

for evaluation in generic_evaluations:
    generic_evaluator = log(evaluation['suffix'])(use_some_other_variable)
    generic_evaluator(evaluation['suffix'], evaluation['id'])