Reputation: 107102
My design is as follows:
__main__
references a
a
references b
b
references a
a
is created and then disposed of from __main__
Thus a
and b
have circular references. However upon del a
I would prefer both a
and b
disposed of.
I see in many places advice to use Context Managers, and specifically the with
statement instead of __del__()
. However all the examples I see of with
start and end in local scope (e.g. of a certain method)
Can this be elegantly performed with with
?
What is the alternative?
Upvotes: 2
Views: 274
Reputation: 391852
What is the alternative?
Do nothing. Until you create millions of circular references like this -- and can prove that this (and only this) is breaking your program -- it doesn't actually matter.
Upvotes: 2
Reputation: 273526
I recommend either:
__del__
but in an explicit dispose
method you call at the right time(s)In general, when you know you have circular references, relying on automatic __del__
disposal is not a good idea. It's brittle - even if you manage to make it work in some case, small changes in dependencies can break it again.
Upvotes: 5