我正在使用带有函数语法的装饰器,如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
答案 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'])