Nik Nik - 1 year ago 158
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

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

Answer Source

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():
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download