访问函数中声明的所有变量而不重复代码

时间:2016-02-12 18:12:04

标签: python function variables scope return-value

假设:

PICKLE_FILENAME_INSTRUCTION_IDS = 'pickled_instruction_ids.txt'

def compare_instruction_id_list_with_baseline(baselineidspicklefile):
    baseline_ids = load_pickled_ids(baselineidspicklefile)
    current_main_url_content = get_page_content(main_url_test)
    root = lh.fromstring(current_main_url_content)
    current_ids = get_instruction_ids(root)
    diff = [id for id in current_ids if id not in baseline_ids]
    return diff

其中baselineidspicklefile是ids的基线(list),腌制。

稍后在代码中,我会检查diff,如果它不为空,我会对新的ID(current_ids)执行某些操作。现在,我意识到如果diff非空,我还希望通过pickle用新的diff列表覆盖基线id,使其成为新的基线。

current_ids是此功能的本地。所以我不能只从程序的主要部分调用pickle.dumps()。我不想从函数中返回diff current_ids。显然,我宁愿不让current_ids全球化。 我有什么选择来访问这两个变量?

注意:这是我遇到的一般问题 - 我在使用urllib2时也会遇到它,例如在执行以下操作的函数中:

response = urllib2.urlopen(url)
content = response.read()

我通常会返回content,因此我可以执行lxml.html.fromstring(content)之类的操作,但后来我意识到程序中的后续内容需要访问response,而且我被卡住了,因为那不是我回来的。

1 个答案:

答案 0 :(得分:4)

您可以使用内置locals()功能:

PICKLE_FILENAME_INSTRUCTION_IDS = 'pickled_instruction_ids.txt'

def compare_instruction_id_list_with_baseline(baselineidspicklefile):
    baseline_ids = load_pickled_ids(baselineidspicklefile)
    current_main_url_content = get_page_content(main_url_test)
    root = lh.fromstring(current_main_url_content)
    current_ids = get_instruction_ids(root)
    diff = [id for id in current_ids if id not in baseline_ids]
    return locals()

然后,您可以使用返回值来使用compare_instruction_id_list_with_baseline中定义的所有变量,然后在括号中使用定义所需变量的字符串。例如,return_value = compare_instruction_id_list_with_baseline(...) diff = return_value['diff']