我从这段代码中得到了异常:
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
行是引发异常的行。m
是Material
对象。有人知道为什么吗?
示例:
self.materials
是一个^{由于} “} exception被引发。
self.materials
有两个以上的键*,因此无法将它们解压缩到^{k, m
”中,因此^{在Python 2.x中,为了迭代键和值(即^{} “} 。
k, m
”),我们使用^{但是,由于您无论如何都要扔掉密钥,您也可以简单地迭代字典的值:
在Python 3.x中,首选^{} (返回dictionary view object):
遍历dictionary对象本身实际上给了您一个遍历其键的迭代器。Python正在尝试将密钥解包,从
m.type + m.purity
将密钥解包到(m, k)
。我的水晶球说
m.type
和m.purity
都是字符串,所以你的键也是字符串。字符串是可iterable的,因此可以对其进行解包;但是对字符串进行迭代会给您提供对其字符的迭代器。因此,每当m.type + m.purity
超过两个字符时,就有太多的值要解包。(而且,当它较短时,您的值太少,无法解包。)要解决这个问题,您可以显式地在dict的
items
上迭代,dict是您所期望的(键、值)对。但是如果你只想要这些值,那么就使用这些值。(在2.x中,
itervalues
、iterkeys
和iteritems
通常是更好的主意;非iter
版本创建一个包含值/键/项的新列表对象。对于迭代中的大型字典和琐碎任务,这可能比刚刚设置迭代器的iter
版本慢得多。)相关问题 更多 >
编程相关推荐