These kind of bugs are common when Python multi-threading. What happens is that, on interpreter tear-down, the relevant module (myThread
in this case) goes through a sort-of del myThread
.
The call self.sample()
is roughly equivalent to myThread.__dict__["sample"](self)
.
But if we're during the interpreter's tear-down sequence, then its own dictionary of known types might've already had myThread
deleted, and now it's basically a NoneType
- and has no 'sample' attribute.