在不复制代码的情况下访问函数中声明的所有变量
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']
.
给定:
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']
.