2012-06-06 3 views
2

Я использую декоратор с функциональным синтаксисом, как описано 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']) 

EDIT

Это будет, вероятно, более ясно, с этим кусок кода в дополнение:

@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 (оценка ['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 Перед назначением здесь LOG (оценка [ 'суффикс']) (generic_evaluator)

try th является:

for evaluation in generic_evaluations: 
    generic_evaluator = log(evaluation['suffix'])(use_some_other_variable) 
    generic_evaluator(evaluation['suffix'], evaluation['id']) 
+0

Я забыл уточнить, что '' generic_evaluator'' уже определен. (См. Мой EDIT) – renard

+0

@renard you ve проблема с этой строкой generic_evaluator = log (оценка ['suffix']) (generic_evaluator) – shiva

+0

Это не другая переменная, которую мне нужно использовать. Это объект функции, который я использую здесь, и это функция, уже определенная, как я сказал в моем редактировании. – renard

Смежные вопросы