Nik Nik - 1 month ago 12
Python Question

Python ValueError: too many values to unpack

I am getting that exception from this code:

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


The
for
line is the one throwing the exception. The
m
s are
Material
objects. Anybody have any ideas why?

Answer

self.materials is a dict and by default you are iterating over just the keys (which are strings).

Since self.materials has more than two keys*, they can't be unpacked into the tuple "k, m", hence the ValueError exception is raised.

In Python 2.x, to iterate over the keys and the values (the tuple "k, m"), we use self.materials.iteritems().

However, since you're throwing the key away anyway, you may as well simply iterate over the dictionary's values:

for m in self.materials.itervalues():

In Python 3.x, prefer dict.values() (which returns a dictionary view object):

for m in self.materials.values():