[Python-Dev] Weakref design questions (original) (raw)

Brian Quinlan brian@sweetapp.com
Fri, 18 Oct 2002 18:21:23 -0700


David Abrahams:

What's the point of the proxy? You never use it for anything. I guess you must've meant:

pythonfunction(proxy)

above.

Nice catch.

Hum. In Boost.Python the default is to copy the C++ object when passing it to a Python callback, though it's possible for the user to explicitly say "just build a Python object around a reference to the C++ object -- Python code beware of lifetime issues". I guess I like your idea, though, as a safer alternative for non-copyable or for very expensive-to-copy C++ objects.

DOMs, the data structures in question, can be obscenely expensive to copy.

And I firmly believe that Python code should never be able to cause a crash.

[nice demonstration deleted]

How does this differ from what's happening for you?

When you created the bound method p.append, you caused the reference count of p to be increased.

In my case, since Python is not capable of altering the lifetime of p (it's dead with the C library says that it is dead), this is a bad thing.

So I proxy the bound methods and kill them when p dies.

Hmm, it kinda seems like you want to prune some of them before the user's done with them.

I actually presented two different desires at once and know I'm paying the price.

There are two reasons that I might want to delete a proxied object:

  1. Its lifetime is over and I don't want anyone to access it
  2. There are no proxy objects that refer to it, making it inaccessible (since I hold the only actual reference)

Reason #1 is why I could like builtin methods to support weakrefs. Reason #2 is why I would like a callback when the last weakref dies.

Don't users expect objects to stay alive when they hold references?

Probably. But that is not always an option.

Cheers, Brian