On Tue, Jan 18, 2011 at 7:09 AM, Scott Dial scott+python-dev@scottdial.com wrote:
I worked around the issue by referencing the __class__ (as the other replier mentioned). But, I didn't receive any responses then, so I think not a lot of attention was put into these type of attributes on exceptions.
That's not a workaround, it is the way you're meant to access __module__ and __name__ on new-style classes (which was the transition that happened for Exception in 2.5).
The fact that user-defined classes get a __module__ attribute on instances while builtin and extension types don't isn't unique to exceptions though:
class C: pass
...
C.__module__
'__main__'
C().__module__
'__main__'
str.__module__
'builtins'
str().__module__
Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'str' object has no attribute '__module__'
import datetime datetime.datetime.__module__
'datetime'
datetime.datetime.now().__module__
Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'datetime.datetime' object has no attribute '__module__'
The addition of __module__ to user defined class instances strikes me as a bug. You can see in the language reference [1] that __dict__ and __class__ are the only expected data attributes for class instances.
[1] http://docs.python.org/dev/reference/datamodel.html (search for the entry on "class instances", then scroll back up and contrast with the sections on class objects, functions and methods)
Cheers, Nick.