On May 9, 6:05 am, John Gordon <gor...@panix.com> wrote: > I'd like to group the classes underneath a parent class, like so: > > class Question(ApplicationException): > > class TooShort(ApplicationException): > pass > > class TooLong(ApplicationException): > pass > > This will make it easier in the future for organizing lots of sub-errors. > > My problem is this: the get_message() method in the base class only knows > the current class name, i.e. "TooShort" or "TooLong". But that's not > enough; I also need to know the outer class name, i.e. "Question.TooShort" > or "Question.TooLong". How do I get the outer class name?
This might do the trick: import inspect def exception_members(scope): classes = (m[1] for m in inspect.getmembers(scope, inspect.isclass)) return set( c for c in classes if Exception in c.__mro__ ) class ApplicationException(Exception): @property def outer_scope(self): for _class in exception_members(inspect.getmodule(self.__class__)): if self.__class__ in exception_members(_class): return _class def get_message(self): scope = self.outer_scope class_name = scope.__name__ + '.' if scope else '' class_name += self.__class__.__name__ return class_name When get_message is run, it looks in the module where the exception was defined for any new classes derived from Exception, then looks at the members of each of those to see if it matches the current object's class. Not really well tested, so beware :) -- http://mail.python.org/mailman/listinfo/python-list