在不复制代码的情况下访问函数中声明的所有变量

Accessing all variables declared in a function without duplicating code

给定:

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的baseline(alist), pickled.

稍后在代码中,我会检查 diff,如果它不为空,我会用新 ID (current_ids) 做一些事情。不过现在,我意识到如果 diff 是非空的,我也希望通过 pickle 用新的差异列表覆盖基线 ID,使其成为新的基线。

current_ids 是这个函数的局部变量。所以我不能只从程序的主要部分调用 pickle.dumps() 。我宁愿不 return 同时 diff current_ids 来自函数。显然我不想让 current_ids 全局化。 我有哪些访问这两个变量的选项?

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

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

我通常 return content 所以我可以做 lxml.html.fromstring(content) 之类的事情,但后来我意识到程序的后面一点需要访问 response,我被卡住了,因为那不是我 returned.

您可以使用内置 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 值,然后在括号中定义您想要的变量的字符串。例如,return_value = compare_instruction_id_list_with_baseline(...) diff = return_value['diff'].