2

ここで説明されているように、機能構文でデコレータを使用しています。

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
4

2 に答える 2

2

generic_evaluatorがグローバル関数であり、実際にグローバル名を再バインドする場合は、generic_evaluatorこの名前をグローバルとして宣言します。

global generic_evaluator

グローバル名を再バインドしたくない場合は、別のローカル名を使用して初期化します。

local_generic_evaluator = generic_evaluator

この答えは、何が起こっているのかを説明しています。

于 2012-06-06T11:40:51.657 に答える
0
generic_evaluator = log(evaluation['suffix'])(generic_evaluator)

ここで割り当てる前にgeneric_evaluatorを参照していますlog(evaluation ['suffix'])(generic_evaluator)

これを試して:

for evaluation in generic_evaluations:
    generic_evaluator = log(evaluation['suffix'])(use_some_other_variable)
    generic_evaluator(evaluation['suffix'], evaluation['id'])
于 2012-06-06T11:18:45.073 に答える