Jonathan Jonathan - 7 months ago 11
Python Question

Unable to reference an imported module in __del__()

I'm using an object's

__del__()
to unsubscribe it from an event (using an event scheme similar to this):

import my_enviroment
class MyClass():
def __del__(self):
my_environment.events.my_event -= self.event_handler_func


Oddly I received the following error at the end of the program's run:

Exception AttributeError: "'NoneType' object has no attribute 'events'" in <bound method MyClass.__del__ of <myclass.MyClass instance at 0x04C54580>> ignored


How could this be possible?!
my_environment
is a module I imported, how come it could be None? (
events
is a global object in it with event hooks such as
my_event
)

Answer

According to the python doc about __del__ :

[...] other globals referenced by the __del__() method may already have been deleted or in the process of being torn down (e.g. the import machinery shutting down). For this reason, __del__() methods should do the absolute minimum needed to maintain external invariants.

In other words, when the __del__ method is called on your object, the my_enviroment may have been 'deleted' by python, so it can be None...

Comments