\section{\module{weakref} ---
         Weak references}

\declaremodule{extension}{weakref}
\modulesynopsis{Support for weak references and weak dictionaries.}
\moduleauthor{Fred L. Drake, Jr.}{fdrake@acm.org}
\moduleauthor{Neil Schemenauer}{nas@arctrix.com}
\moduleauthor{Martin von L\"owis}{martin@loewis.home.cs.tu-berlin.de}
\sectionauthor{Fred L. Drake, Jr.}{fdrake@acm.org}

\versionadded{2.1}

% When making changes to the examples in this file, be sure to update
% Lib/test/test_weakref.py::libreftest too!

The \module{weakref} module allows the Python programmer to create
\dfn{weak references} to objects.

In the following, the term \dfn{referent} means the
object which is referred to by a weak reference.

A weak reference to an object is not enough to keep the object alive:
when the only remaining references to a referent are weak references,
garbage collection is free to destroy the referent and reuse its memory
for something else.  A primary use for weak references is to implement
caches or mappings holding large objects, where it's desired that a
large object not be kept alive solely because it appears in a cache or
mapping.  For example, if you have a number of large binary image objects,
you may wish to associate a name with each.  If you used a Python
dictionary to map names to images, or images to names, the image objects
would remain alive just because they appeared as values or keys in the
dictionaries.  The \class{WeakKeyDictionary} and
\class{WeakValueDictionary} classes supplied by the \module{weakref}
module are an alternative, using weak references to construct mappings
that don't keep objects alive solely because they appear in the mapping
objects.  If, for example, an image object is a value in a
\class{WeakValueDictionary}, then when the last remaining
references to that image object are the weak references held by weak
mappings, garbage collection can reclaim the object, and its corresponding
entries in weak mappings are simply deleted.

\class{WeakKeyDictionary} and \class{WeakValueDictionary} use weak
references in their implementation, setting up callback functions on
the weak references that notify the weak dictionaries when a key or value
has been reclaimed by garbage collection.  Most programs should find that
using one of these weak dictionary types is all they need -- it's
not usually necessary to create your own weak references directly.  The
low-level machinery used by the weak dictionary implementations is exposed
by the \module{weakref} module for the benefit of advanced uses.

Not all objects can be weakly referenced; those objects which can
include class instances, functions written in Python (but not in C),
methods (both bound and unbound), sets, frozensets, file objects,
generators, type objects, DBcursor objects from the \module{bsddb} module,
sockets, arrays, deques, and regular expression pattern objects.
\versionchanged[Added support for files, sockets, arrays, and patterns]{2.4}

Several builtin types such as \class{list} and \class{dict} do not
directly support weak references but can add support through subclassing:

\begin{verbatim}
class Dict(dict):
    pass

obj = Dict(red=1, green=2, blue=3)   # this object is weak referencable
\end{verbatim}

Extension types can easily be made to support weak references; see
``\ulink{Weak Reference Support}{../ext/weakref-support.html}'' in
\citetitle[../ext/ext.html]{Extending and Embedding the Python
Interpreter}.
% The referenced section used to appear in this document with the
% \label weakref-extension.  It would be good to be able to generate a
% redirect for the corresponding HTML page (weakref-extension.html)
% for on-line versions of this document.

\begin{classdesc}{ref}{object\optional{, callback}}
  Return a weak reference to \var{object}.  The original object can be
  retrieved by calling the reference object if the referent is still
  alive; if the referent is no longer alive, calling the reference
  object will cause \constant{None} to be returned.  If \var{callback} is
  provided and not \constant{None}, and the returned weakref object is
  still alive, the callback will be called when the object is about to be
  finalized; the weak reference object will be passed as the only
  parameter to the callback; the referent will no longer be available.

  It is allowable for many weak references to be constructed for the
  same object.  Callbacks registered for each weak reference will be
  called from the most recently registered callback to the oldest
  registered callback.

  Exceptions raised by the callback will be noted on the standard
  error output, but cannot be propagated; they are handled in exactly
  the same way as exceptions raised from an object's
  \method{__del__()} method.

  Weak references are hashable if the \var{object} is hashable.  They
  will maintain their hash value even after the \var{object} was
  deleted.  If \function{hash()} is called the first time only after
  the \var{object} was deleted, the call will raise
  \exception{TypeError}.

  Weak references support tests for equality, but not ordering.  If
  the referents are still alive, two references have the same
  equality relationship as their referents (regardless of the
  \var{callback}).  If either referent has been deleted, the
  references are equal only if the reference objects are the same
  object.

  \versionchanged[This is now a subclassable type rather than a
                  factory function; it derives from \class{object}]
                  {2.4}
\end{classdesc}

\begin{funcdesc}{proxy}{object\optional{, callback}}
  Return a proxy to \var{object} which uses a weak reference.  This
  supports use of the proxy in most contexts instead of requiring the
  explicit dereferencing used with weak reference objects.  The
  returned object will have a type of either \code{ProxyType} or
  \code{CallableProxyType}, depending on whether \var{object} is
  callable.  Proxy objects are not hashable regardless of the
  referent; this avoids a number of problems related to their
  fundamentally mutable nature, and prevent their use as dictionary
  keys.  \var{callback} is the same as the parameter of the same name
  to the \function{ref()} function.
\end{funcdesc}

\begin{funcdesc}{getweakrefcount}{object}
  Return the number of weak references and proxies which refer to
  \var{object}.
\end{funcdesc}

\begin{funcdesc}{getweakrefs}{object}
  Return a list of all weak reference and proxy objects which refer to
  \var{object}.
\end{funcdesc}

\begin{classdesc}{WeakKeyDictionary}{\optional{dict}}
  Mapping class that references keys weakly.  Entries in the
  dictionary will be discarded when there is no longer a strong
  reference to the key.  This can be used to associate additional data
  with an object owned by other parts of an application without adding
  attributes to those objects.  This can be especially useful with
  objects that override attribute accesses.

  \note{Caution:  Because a \class{WeakKeyDictionary} is built on top
        of a Python dictionary, it must not change size when iterating
        over it.  This can be difficult to ensure for a
        \class{WeakKeyDictionary} because actions performed by the
        program during iteration may cause items in the dictionary
        to vanish "by magic" (as a side effect of garbage collection).}
\end{classdesc}

\class{WeakKeyDictionary} objects have the following additional
methods.  These expose the internal references directly.  The
references are not guaranteed to be ``live'' at the time they are
used, so the result of calling the references needs to be checked
before being used.  This can be used to avoid creating references that
will cause the garbage collector to keep the keys around longer than
needed.

\begin{methoddesc}{iterkeyrefs}{}
  Return an iterator that yields the weak references to the keys.
  \versionadded{2.5}
\end{methoddesc}

\begin{methoddesc}{keyrefs}{}
  Return a list of weak references to the keys.
  \versionadded{2.5}
\end{methoddesc}

\begin{classdesc}{WeakValueDictionary}{\optional{dict}}
  Mapping class that references values weakly.  Entries in the
  dictionary will be discarded when no strong reference to the value
  exists any more.

  \note{Caution:  Because a \class{WeakValueDictionary} is built on top
        of a Python dictionary, it must not change size when iterating
        over it.  This can be difficult to ensure for a
        \class{WeakValueDictionary} because actions performed by the
        program during iteration may cause items in the dictionary
        to vanish "by magic" (as a side effect of garbage collection).}
\end{classdesc}

\class{WeakValueDictionary} objects have the following additional
methods.  These method have the same issues as the
\method{iterkeyrefs()} and \method{keyrefs()} methods of
\class{WeakKeyDictionary} objects.

\begin{methoddesc}{itervaluerefs}{}
  Return an iterator that yields the weak references to the values.
  \versionadded{2.5}
\end{methoddesc}

\begin{methoddesc}{valuerefs}{}
  Return a list of weak references to the values.
  \versionadded{2.5}
\end{methoddesc}

\begin{datadesc}{ReferenceType}
  The type object for weak references objects.
\end{datadesc}

\begin{datadesc}{ProxyType}
  The type object for proxies of objects which are not callable.
\end{datadesc}

\begin{datadesc}{CallableProxyType}
  The type object for proxies of callable objects.
\end{datadesc}

\begin{datadesc}{ProxyTypes}
  Sequence containing all the type objects for proxies.  This can make
  it simpler to test if an object is a proxy without being dependent
  on naming both proxy types.
\end{datadesc}

\begin{excdesc}{ReferenceError}
  Exception raised when a proxy object is used but the underlying
  object has been collected.  This is the same as the standard
  \exception{ReferenceError} exception.
\end{excdesc}


\begin{seealso}
  \seepep{0205}{Weak References}{The proposal and rationale for this
                feature, including links to earlier implementations
                and information about similar features in other
                languages.}
\end{seealso}


\subsection{Weak Reference Objects
            \label{weakref-objects}}

Weak reference objects have no attributes or methods, but do allow the
referent to be obtained, if it still exists, by calling it:

\begin{verbatim}
>>> import weakref
>>> class Object:
...     pass
...
>>> o = Object()
>>> r = weakref.ref(o)
>>> o2 = r()
>>> o is o2
True
\end{verbatim}

If the referent no longer exists, calling the reference object returns
\constant{None}:

\begin{verbatim}
>>> del o, o2
>>> print r()
None
\end{verbatim}

Testing that a weak reference object is still live should be done
using the expression \code{\var{ref}() is not None}.  Normally,
application code that needs to use a reference object should follow
this pattern:

\begin{verbatim}
# r is a weak reference object
o = r()
if o is None:
    # referent has been garbage collected
    print "Object has been deallocated; can't frobnicate."
else:
    print "Object is still live!"
    o.do_something_useful()
\end{verbatim}

Using a separate test for ``liveness'' creates race conditions in
threaded applications; another thread can cause a weak reference to
become invalidated before the weak reference is called; the
idiom shown above is safe in threaded applications as well as
single-threaded applications.

Specialized versions of \class{ref} objects can be created through
subclassing.  This is used in the implementation of the
\class{WeakValueDictionary} to reduce the memory overhead for each
entry in the mapping.  This may be most useful to associate additional
information with a reference, but could also be used to insert
additional processing on calls to retrieve the referent.

This example shows how a subclass of \class{ref} can be used to store
additional information about an object and affect the value that's
returned when the referent is accessed:

\begin{verbatim}
import weakref

class ExtendedRef(weakref.ref):
    def __init__(self, ob, callback=None, **annotations):
        super(ExtendedRef, self).__init__(ob, callback)
        self.__counter = 0
        for k, v in annotations.iteritems():
            setattr(self, k, v)

    def __call__(self):
        """Return a pair containing the referent and the number of
        times the reference has been called.
        """
        ob = super(ExtendedRef, self).__call__()
        if ob is not None:
            self.__counter += 1
            ob = (ob, self.__counter)
        return ob
\end{verbatim}


\subsection{Example \label{weakref-example}}

This simple example shows how an application can use objects IDs to
retrieve objects that it has seen before.  The IDs of the objects can
then be used in other data structures without forcing the objects to
remain alive, but the objects can still be retrieved by ID if they
do.

% Example contributed by Tim Peters.
\begin{verbatim}
import weakref

_id2obj_dict = weakref.WeakValueDictionary()

def remember(obj):
    oid = id(obj)
    _id2obj_dict[oid] = obj
    return oid

def id2obj(oid):
    return _id2obj_dict[oid]
\end{verbatim}
