The Django docs say this on the subject:
Note also that Django stores signal
handlers as weak references by
default, so if your handler is a local
function, it may be garbage collected.
To prevent this, pass weak=False when
you call the signal’s connect().
I haven’t been able to find any justification for why this is the default, and I don’t understand why you would ever want a signal that you explicitly registered to implicitly disappear. So what is the use-case for weak references here? And why is it the default?
I realize it probably doesn’t matter either way in 99% of cases, but clearly there’s something I don’t understand here, and I want to know if there’s any “gotchas” lurking that might bite me someday.
Signals handlers are stored as weak references to avoid the object they reference from not being garbage collected (for example after explicit deletion of the signal handler), just because a signal is still flying around.