On 06/09/2023 03:47, Daniel Walker wrote:
Perhaps this is a solution in search of a problem but I recently encountered this situation in one of my projects.

I have an object, foo, which, due to the references it contains, I'd rather not keep around longer than necessary.

I use foo to instantiate another object:

    bar = Bar(foo)

bar is free to manipulate foo however it wants and even del it if necessary.  However, since the foo name is still around, those resources won't get cleaned up even if bar is done with them.  The simple solution is

It's a neat idea but there are other ways that may be better.

I assume foo is a "specification", that is, an object you configure through a number of optional calls or attribute assignments, then pass to Bar() as a design alternative to Bar() having a complicated set of arguments. A pattern often used is the fluent API:

bar = Bar(Foo().a().b(42).c('penguin'))

Now only Bar has a reference to the Foo you made.

But foo is not necessarily destroyed immediately the last reference to it is dropped, even with del or when nameless in the fluent API. If you wanted to be certain, you could make Foo a context manager to use like this:

with Foo() as foo:
    foo.a()
    foo.b(42)
    foo.c('penguin')
    bar = Bar(foo)
bar.do_stuff()

(Think I got that right. Not tried it.) Now Foo.__exit__ can be made to properly tear down the resources in a foo.

--

Jeff Allen
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/75EXWHY3SFZSZTZUQJPIBMXFRF3J327I/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to