> raise error("groups number is too large")
Oh, I hate that kind of error message. Why couldn't it be something useful like
raise error("groups number is too large "
"(you have used %d out of an "
"allowed %d)" % (self.groups, MAXGROUPS))