为装饰器分配之前引用的局部变量
问题描述:
我正在使用装饰器,其功能语法如其描述的here。为装饰器分配之前引用的局部变量
我循环了一个字典列表。在这个循环中,我使用装饰器采用参数来包装泛型函数。然后我用当前的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
答
如果generic_evaluator
是一个全球性的功能,你真的想重新绑定全局名称generic_evaluator
,声明这个名字作为全球:
global generic_evaluator
如果你不想重新绑定全球名称,使用不同的本地名称和初始化它:
local_generic_evaluator = generic_evaluator
This answer给出发生了什么事情的说明。
答
generic_evaluator = log(evaluation['suffix'])(generic_evaluator)
您分配之前referrencing generic_evaluator登陆这里(评价[ 'suffix'])(generic_evaluator)
尝试th是:
for evaluation in generic_evaluations:
generic_evaluator = log(evaluation['suffix'])(use_some_other_variable)
generic_evaluator(evaluation['suffix'], evaluation['id'])
你为什么认为它应该工作。这里:'log(evaluation ['suffix'])(generic_evaluator)'你正在使用'generic_evaluator',它还没有被赋值。因此错误。你究竟想达到什么目的? – Vikas