mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +00:00 
			
		
		
		
	get() method; just calling them is sufficient. (There was a get() method for this in an early version of the implementation.) Reported by Mats Wichmann.
		
			
				
	
	
		
			251 lines
		
	
	
	
		
			8.3 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			251 lines
		
	
	
	
		
			8.3 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
\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}
 | 
						|
 | 
						|
 | 
						|
The \module{weakref} module allows the Python programmer to create
 | 
						|
\dfn{weak references} to objects.
 | 
						|
 | 
						|
XXX --- need to say more here!
 | 
						|
 | 
						|
Not all objects can be weakly referenced; those objects which do
 | 
						|
include class instances, functions written in Python (but not in C),
 | 
						|
and methods (both bound and unbound).  Extension types can easily
 | 
						|
be made to support weak references; see section \ref{weakref-extension},
 | 
						|
``Weak References in Extension Types,'' for more information.
 | 
						|
 | 
						|
 | 
						|
\begin{funcdesc}{ref}{object\optional{, callback}}
 | 
						|
  Return a weak reference to \var{object}.  If \var{callback} is
 | 
						|
  provided, it 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.
 | 
						|
  The original object can be retrieved by calling the reference
 | 
						|
  object, if the referent is still alive.
 | 
						|
 | 
						|
  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 test for equality, but not ordering.  If the
 | 
						|
  \var{object} is still alive, to references are equal if the objects
 | 
						|
  are equal (regardless of the \var{callback}).  If the \var{object}
 | 
						|
  has been deleted, they are equal iff they are identical.
 | 
						|
\end{funcdesc}
 | 
						|
 | 
						|
\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.
 | 
						|
\end{classdesc}
 | 
						|
 | 
						|
\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 anymore.
 | 
						|
\end{classdesc}
 | 
						|
 | 
						|
\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.
 | 
						|
\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
 | 
						|
1
 | 
						|
\end{verbatim}
 | 
						|
 | 
						|
If the referent no longer exists, calling the reference object returns
 | 
						|
\code{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}
 | 
						|
o = ref()
 | 
						|
if o is None:
 | 
						|
    # referent has been garbage collected
 | 
						|
    print "Object has been allocated; 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 \method{get()} method is called; the
 | 
						|
idiom shown above is safe in threaded applications as well as
 | 
						|
single-threaded applications.
 | 
						|
 | 
						|
 | 
						|
\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 <tim_one@msn.com>.
 | 
						|
\begin{verbatim}
 | 
						|
import weakref
 | 
						|
 | 
						|
_id2obj_dict = weakref.WeakValueDictionary()
 | 
						|
 | 
						|
def remember(obj):
 | 
						|
    _id2obj_dict[id(obj)] = obj
 | 
						|
 | 
						|
def id2obj(id):
 | 
						|
    return _id2obj_dict(id)
 | 
						|
\end{verbatim}
 | 
						|
 | 
						|
 | 
						|
\subsection{Weak References in Extension Types
 | 
						|
            \label{weakref-extension}}
 | 
						|
 | 
						|
One of the goals of the implementation is to allow any type to
 | 
						|
participate in the weak reference mechanism without incurring the
 | 
						|
overhead on those objects which do not benefit by weak referencing
 | 
						|
(such as numbers).
 | 
						|
 | 
						|
For an object to be weakly referencable, the extension must include a
 | 
						|
\ctype{PyObject *} field in the instance structure for the use of the
 | 
						|
weak reference mechanism; it must be initialized to \NULL{} by the
 | 
						|
object's constructor.  It must also set the \member{tp_weaklistoffset}
 | 
						|
field of the corresponding type object to the offset of the field.
 | 
						|
For example, the instance type is defined with the following structure:
 | 
						|
 | 
						|
\begin{verbatim}
 | 
						|
typedef struct {
 | 
						|
    PyObject_HEAD
 | 
						|
    PyClassObject *in_class;       /* The class object */
 | 
						|
    PyObject      *in_dict;        /* A dictionary */
 | 
						|
    PyObject      *in_weakreflist; /* List of weak references */
 | 
						|
} PyInstanceObject;
 | 
						|
\end{verbatim}
 | 
						|
 | 
						|
The statically-declared type object for instances is defined this way:
 | 
						|
 | 
						|
\begin{verbatim}
 | 
						|
PyTypeObject PyInstance_Type = {
 | 
						|
    PyObject_HEAD_INIT(&PyType_Type)
 | 
						|
    0,
 | 
						|
    "instance",
 | 
						|
 | 
						|
    /* Lots of stuff omitted for brevity... */
 | 
						|
 | 
						|
    offsetof(PyInstanceObject, in_weakreflist) /* tp_weaklistoffset */
 | 
						|
};
 | 
						|
\end{verbatim}
 | 
						|
 | 
						|
The only further addition is that the destructor needs to call the
 | 
						|
weak reference manager to clear any weak references.  This should be
 | 
						|
done before any other parts of the destruction have occurred:
 | 
						|
 | 
						|
\begin{verbatim}
 | 
						|
static void
 | 
						|
instance_dealloc(PyInstanceObject *inst)
 | 
						|
{
 | 
						|
    /* Allocate tempories if needed, but do not begin
 | 
						|
       destruction just yet.
 | 
						|
     */
 | 
						|
 | 
						|
    PyObject_ClearWeakRefs((PyObject *) inst);
 | 
						|
 | 
						|
    /* Proceed with object destuction normally. */
 | 
						|
}
 | 
						|
\end{verbatim}
 |