python - Python:返回时解包的值太多
问题描述
我希望,这不是重复的。我知道太多无法解包的值意味着什么。我返回两个值,并尝试接受两个值。
我只提供一小部分代码,我希望它就足够了。
def test(all the arguments in function_parameters):
// do something
dfData.append([fileToCheck,5,";".join(faceNames),frameTime,";".join(faceDistances),";".join(faceLocations),";".join(gender),str(";".join(age)),str(";".join(expression))])
if len(face_locations) != 0:
keyPointsData.append([fileToCheck,time,str(";".join(encodings)),str(";".join(encodings)),time])
else:
keyPointsData.append([fileToCheck,time,"","",time])
return dfData, keyPointsData
#Start multiprocessing
#Pass variables to the function
function_parameters = zip(
images_to_check,
itertools.repeat(known_names),
itertools.repeat(known_face_encodings),
itertools.repeat(tolerance),
itertools.repeat(processImages),
itertools.repeat(processVideos),
itertools.repeat(fpstoprocess),
itertools.repeat(upsample),
itertools.repeat(algo),
itertools.repeat(onlydetection),
itertools.repeat(saveimagespath),
itertools.repeat(savefullimages),
itertools.repeat(savefaceimage),
itertools.repeat(enablebox),
itertools.repeat(maxarea),
listNumber,
itertools.repeat(totalImages),
itertools.repeat(imageExtensions),
itertools.repeat(videoExtensions),
itertools.repeat(debug),
itertools.repeat(age),
itertools.repeat(gender),
itertools.repeat(expression),
itertools.repeat(keypointsDF)
)
rows,keypointsData = pool.starmap(test, function_parameters)
tdfData
并且keyPointsData
是多维列表。我正在使用多线程
我在这一行遇到错误rows,keypointsData = pool.starmap(test, function_parameters)
完整的错误信息
Traceback (most recent call last):
File "face.py", line 829, in <module>
main()
File "face.py", line 702, in main
process_images_in_process_pool()
File "face.py", line 584, in process_images_in_process_pool
rows,keypointsData = pool.starmap(test, function_parameters)
ValueError: too many values to unpack (expected 2)
解决方案
根据官方文档https://docs.python.org/3/library/multiprocessing.html#multiprocessing.pool.Pool.starmap
starmap 采用一个迭代器来调用具有来自迭代器的不同输入的函数,然后返回另一个迭代器,其中包含所有输出及其相应的输入。
所以这里举个例子:
def test(a, b):
return a, b
现在使用不同输入的迭代器调用函数:
iter1 = zip([1, 2], [3, 4])
list_of_results = pool.starmap(test, iter1)
>>> list_of_results
>>> [(2, 3), (4, 5)]
x, y = pool.starmap(test, iter1) # unpacking will work
但如果迭代器调用超过 2 次,使用 2 个变量解包将失败:
iter2 = zip([1, 2, 3], [4, 5, 6])
list_of_results = pool.starmap(test, iter2)
>>> list_of_results
>>> [(2, 5), (3, 6), (4, 7)]
x, y = pool.starmap(test, iter1) # unpacking will fail
因此,首先将结果存储在其中list_of_results
,然后对其进行迭代以使用输出值来避免解包问题。
希望它能消除疑虑和问题
推荐阅读
- html - 如何在 HTML/CSS 中创建跟踪视口的背景?
- javascript - javascript按钮行为的初学者问题
- java - 有人可以帮我修复这个程序吗?
- python - 要拆分的字符串列表的每个元素
- java - 使用 Maven 复制非编译文件
- php - 如何从 html 删除按钮中删除 mysql 数据?
- c# - 为什么连接对象中包含 Null 属性
- ruby-on-rails - 加载“sqlite3”Active Record 适配器时出错,Ruby on Rails 错误 Win10 64bit
- process - 是否有任何代码可以将 excel 中的原始数据修改为流程挖掘所需的事件日志
- python - 有没有办法将 npz 文件转换为熊猫数据框?