Python代码:announcementStrList = [
"^更新公告$", # strict full match
"^游戏公告$", # strict full match
]
isAnnouncement = False
foundResultDict, imgPath = self.isWordsInCurScreen(announcementStrList)
for eachPossibleStr in announcementStrList:
curIsFound, _, curImgPath = foundResultDict[eachPossibleStr]
其中返回的foundResultDict,是一个dict,且值是希望的,正常的值:{'^更新公告$': (True, (...)), '^游戏公告$': (True, (...))}
但是调试时报错:发生异常: ValueError
not enough values to unpack (expected 3, got 2)
看起来,估计是:
dict(变量foundResultDict)中的key是特殊的字符串,此处的 “^更新公告$”,导致了此处错误
去研究看看如何解决
python dict not enough values to unpack (expected 3, got 2)
然后才注意到的是:
其实不是上述dict中key是特殊字符导致的,而是:
获取dict的值后,只有2项:(True, (...))
但是却被赋值给了3个变量curIsFound, _, curImgPath
而之所以把变量个数搞错,是因为刚才在优化函数isWordsInCurScreen,改动了之前返回值的逻辑。
所以此处解决办法很简单,去改为:curIsFound, _ = foundResultDict[eachPossibleStr]
即可。
【总结】
此处python中的dict报错:not enough values to unpack (expected 3, got 2)
的原因:
不是:看起来的,以为的,dict中的key,’^更新公告$’,以为是包含特殊字符,导致无法获取到dict中的值呢
实际上是:通过key,获取了dict的值,返回后,本来只有2部分,却给了3个变量
即:twoPartTupleDict = {
"theKey": ("part1", “part2")
}
但是却:(value1, value2, value3) = twoPartTupleDict["theKey"]
导致报错的。
实际上应该是:(value1, value2) = twoPartTupleDict["theKey"]
所以此处把:curIsFound, _, curImgPath = foundResultDict[eachPossibleStr]
改为:curIsFound, _ = foundResultDict[eachPossibleStr]
即可。
【后记】
专门对于StackOverflow中相关帖子去给出了详尽的回答。
此处贴出核心演示代码:#!/usr/bin/python
# -*- coding: utf-8 -*-
# Function: Showing how to understand ValueError 'not enough values to unpack (expected 3, got 2)'
# Author: Crifan Li
# Update: 20191212
def notEnoughUnpack():
"""Showing how to understand python error `not enough values to unpack (expected 3, got 2)`"""
# a dict, which single key's value is two part tuple
valueIsTwoPartTupleDict = {
"name1": ("lastname1", "email1"),
"name2": ("lastname2", "email2"),
}
# Test case 1: got value from key
gotLastname, gotEmail = valueIsTwoPartTupleDict["name1"] # OK
print("gotLastname=%s, gotEmail=%s" % (gotLastname, gotEmail))
# gotLastname, gotEmail, gotOtherSomeValue = valueIsTwoPartTupleDict["name1"] # -> ValueError not enough values to unpack (expected 3, got 2)
# Test case 2: got from dict.items()
for eachKey, eachValues in valueIsTwoPartTupleDict.items():
print("eachKey=%s, eachValues=%s" % (eachKey, eachValues))
# same as following:
# Background knowledge: each of dict.items() return (key, values)
# here above eachValues is a tuple of two parts
for eachKey, (eachValuePart1, eachValuePart2) in valueIsTwoPartTupleDict.items():
print("eachKey=%s, eachValuePart1=%s, eachValuePart2=%s" % (eachKey, eachValuePart1, eachValuePart2))
# but following:
for eachKey, (eachValuePart1, eachValuePart2, eachValuePart3) in valueIsTwoPartTupleDict.items(): # will -> ValueError not enough values to unpack (expected 3, got 2)
pass
if __name__ == "__main__":
notEnoughUnpack()
和截图:
更多细节详见: