python-3.x - Python 嵌套函数变量作用域
问题描述
我有以下功能:
def print_hamming_distance(calls):
#calls is a dictionary
samples = calls.keys()
with Pool(8) as pool: #Parallel Process
for dist, sample1, sample2 in pool.imap(multi_proc_hamming_distance, itertools.combinations(samples,2)):
print( dist, sample1, sample2 )
def multi_proc_hamming_distance(samples): # specifically created function to use with pool
return hamming_distance(calls[samples[0]],calls[samples[1]]), samples[0], samples[1]
当我在代码中调用它们时,出现此错误:
NameError: name 'calls' is not defined
我的印象是嵌套函数可以访问该函数之外的变量。有人可以向我解释为什么我会收到这个错误吗?
我意识到解决方案之一只是将字典作为参数传递给第二个函数,这就是我解决问题的方法,但这增加了运行时间。此外,当我在 jupyter 上运行代码而不包装 print_hamming_distance(calls) 时,它起作用了。
通过不包装我的意思是这样的:
def multi_proc_hamming_distance(samples): # specifically created function to use with pool
return hamming_distance(calls[samples[0]],calls[samples[1]]), samples[0], samples[1]
#calls is already defined somewhere
samples = calls.keys()
with Pool(8) as pool: #Parallel Process
for dist, sample1, sample2 in pool.imap(multi_proc_hamming_distance, itertools.combinations(samples,2)):
print( dist, sample1, sample2 )
编辑:完整回溯错误
multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
File "/home/usr/anaconda3/envs/some_env/lib/python3.5/multiprocessing/pool.py", line 119, in worker
result = (True, func(*args, **kwds))
File "/usr/project/pipeline/project_name/distance.py", line 44, in multi_proc_hamming_distance
return hamming_distance(calls[samples[0]],calls[samples[1]]), samples[0], samples[1]
NameError: name 'calls' is not defined
"""
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/usr/project/pipeline/project_name.py", line 264, in <module>
main()
File "/usr/project/pipeline/project_name.py", line 259, in main
distance(param)
File "/usr/project/pipeline/project_name.py", line 169, in distance
distance = get_distance[param.data_type](calls)
File "/usr/project/pipeline/project_name/distance.py", line 37, in get_param_type_distance
for dist, sample1, sample2 in pool.imap(multi_proc_hamming_distance, itertools.combinations(samples,2)):
File "/home/usr/anaconda3/envs/some_env/lib/python3.5/multiprocessing/pool.py", line 731, in next
raise value
解决方案
是的,嵌套函数可以访问该函数之外的变量。但是在您的情况下,调用变量未在函数内部定义,它只是一个参数,嵌套函数无法访问。您可以通过添加calls = calls
以下内容来纠正它。
def print_hamming_distance(calls):
#calls is a dictionary
calls = calls
samples = calls.keys()
with Pool(8) as pool: #Parallel Process
for dist, sample1, sample2 in pool.imap(multi_proc_hamming_distance, itertools.combinations(samples,2)):
print( dist, sample1, sample2 )
# nested function
def multi_proc_hamming_distance(calls,samples): # specifically created function to use with pool
return hamming_distance(calls[samples[0]],calls[samples[1]]), samples[0], samples[1]
推荐阅读
- c - 在c中保存/加载链表
- php - 在每个产品下的产品存档页面上显示 woocommerce 产品 ID
- laravel - Azure App Service 和 Office365 SMTP,邮件未送达但未报告错误
- npm - 如何手动“npm audit fix”单个安全问题?
- graphql - 将 Graphql Mutation 输入溢出到四个部分
- c++ - 4 元素归一化函数的输出
- random - SAS:用变量创建协方差矩阵
- json - Angular 12 从 JSON 读取“内容”
- java - 如何在 SharedPreferences 中保存我的应用程序主题?
- reactjs - React防止表单中的按钮在点击返回时被点击