In your specific example it would be simplest to not give spam a default value -- Python will then diagnose the problem for you if the user forgets to pass that argument. (However, passing False, 0, [], ... as spam would be OK for Python, so if you have requirements against them you might have to additionally specify your own semantics checks).
If you do have to perform any diagnosis, raising an exception if it fails is sensible. However it should be the proper exception -- e.g., ValueError if the value is of an acceptable type but not acceptable as its specific value -- and with a clear, complete message. So, summarizing:
class Breakfast(object):
def __init__(self, spam, eggs=0):
if not spam:
raise ValueError("falsish spam %r not acceptable" % (spam,))
(You do need to wrap spam in a single-item tuple (spam,) here, else passing an empty tuple as spam would result in a complicated, confusing error;-).