2012-06-06 77 views
2

我正在使用裝飾器,其功能語法如其描述的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

回答

2

如果generic_evaluator是一個全球性的功能,你真的想重新綁定全局名稱generic_evaluator,聲明這個名字作爲全球:

global generic_evaluator 

如果你不想重新綁定全球名稱,使用不同的本地名稱和初始化它:

local_generic_evaluator = generic_evaluator 

This answer給出發生了什麼事情的說明。

0
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

相關問題