为装饰器分配之前引用的局部变量

问题描述:

我正在使用装饰器,其功能语法如其描述的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 
+0

你为什么认为它应该工作。这里:'log(evaluation ['suffix'])(generic_evaluator)'你正在使用'generic_evaluator',它还没有被赋值。因此错误。你究竟想达到什么目的? – Vikas

如果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']) 
+0

我忘了确切地说''generic_evaluator''已经定义好了。 (请参阅我的编辑) – renard

+0

@renard你有问题这一行generic_evaluator = log(evaluation ['suffix'])(generic_evaluator) – shiva

+0

这不是我需要使用的另一个变量。这是一个我在这里使用的函数对象,它是一个已经定义好的函数,正如我在编辑中所说的那样。 – renard