2

我正在使用具有此处描述的功能语法的装饰器。

我遍历一个字典列表。在这个循环中,我用带参数的装饰器包装了一个通用函数。然后我用当前字典作为参数调用包装函数。

我的问题是我得到一个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
4

2 回答 2

2

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

global generic_evaluator

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

local_generic_evaluator = generic_evaluator

这个答案解释了发生了什么。

于 2012-06-06T11:40:51.657 回答
0
generic_evaluator = log(evaluation['suffix'])(generic_evaluator)

您在此处分配之前引用 generic_evaluator log(evaluation['suffix'])(generic_evaluator)

尝试这个:

for evaluation in generic_evaluations:
    generic_evaluator = log(evaluation['suffix'])(use_some_other_variable)
    generic_evaluator(evaluation['suffix'], evaluation['id'])
于 2012-06-06T11:18:45.073 回答