PythonValueError: 解压缩的值太多

我从这段代码中得到了这个异常:

class Transaction:
def __init__ (self):
self.materials = {}


def add_material (self, m):
self.materials[m.type + m.purity] = m


def serialize (self):
ser_str = 'transaction_start\n'


for k, m in self.materials:
ser_str += m.serialize ()


sert += 'transaction_end\n'
return ser_str

抛出异常的是 for行。 mMaterial对象。有人知道为什么吗?

427733 次浏览
for k, m in self.materials.items():

例如:

miles_dict = {'Monday':1, 'Tuesday':2.3, 'Wednesday':3.5, 'Thursday':0.9}
for k, v in miles_dict.items():
print("%s: %s" % (k, v))

对字典对象本身进行迭代实际上为您提供了对其 钥匙的迭代器。Python 正在尝试解压缩密钥,这些密钥是从 m.type + m.purity(m, k)的。

我的水晶球说 m.typem.purity都是字符串,所以你的键也是字符串。字符串是可迭代的,因此它们可以被解压缩; 但是对字符串进行迭代可以为字符提供一个迭代器。因此,只要 m.type + m.purity超过两个字符长度,就有太多值需要解压缩。(而且每当它变短时,需要解压缩的值就太少了。)

为了解决这个问题,您可以显式地在 dict 的 items上迭代,它们是您似乎期望的(键,值)对。但是如果您只想要值,那么只需要使用这些值。

(在2.x 中,itervaluesiterkeysiteritems通常是一个更好的主意; 非 iter版本创建一个新的列表对象,其中包含值/键/项。对于迭代中的大型字典和琐碎任务,这可能比刚刚设置了迭代器的 iter版本慢得多。)

self.materialsdict,默认情况下,您只是迭代键(字符串)。

由于 self.materials有两个以上的键 *,它们不能被解包成 tuplek, m”,因此 ValueError 例外被提高。

在 Python2.X中,为了迭代键和值(tuplek, m”) ,我们使用 self.materials.iteritems()

不过,既然您已经丢弃了键,那么您也可以简单地迭代字典的值:

for m in self.materials.itervalues():

在 Python3.X中,首选 dict.values()(返回 字典视图对象字典视图对象) :

for m in self.materials.values():