mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	 146483964e
			
		
	
	
		146483964e
		
	
	
	
	
		
			
			type.__module__ behavior. This adds the module name and a dot in front of the type name in every type object initializer, except for built-in types (and those that already had this). Note that it touches lots of Mac modules -- I have no way to test these but the changes look right. Apologies if they're not. This also touches the weakref docs, which contains a sample type object initializer. It also touches the mmap test output, because the mmap type's repr is included in that output. It touches object.h to put the correct description in a comment.
		
			
				
	
	
		
			263 lines
		
	
	
	
		
			8.8 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			263 lines
		
	
	
	
		
			8.8 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.
 | |
| 
 | |
| In the discussion which follows, the term \dfn{referent} means the
 | |
| object which is referred to by a weak reference.
 | |
| 
 | |
| 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}.  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 \code{None} to be returned.  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.
 | |
| 
 | |
|   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.
 | |
| \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 any more.
 | |
| \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.  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
 | |
| 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}
 | |
| # r is a weak reference object
 | |
| o = r()
 | |
| 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 weak reference 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):
 | |
|     oid = id(obj)
 | |
|     _id2obj_dict[oid] = obj
 | |
|     return oid
 | |
| 
 | |
| def id2obj(oid):
 | |
|     return _id2obj_dict[oid]
 | |
| \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,
 | |
|     "module.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, but is
 | |
| only required if the weak reference list is non-\NULL:
 | |
| 
 | |
| \begin{verbatim}
 | |
| static void
 | |
| instance_dealloc(PyInstanceObject *inst)
 | |
| {
 | |
|     /* Allocate temporaries if needed, but do not begin
 | |
|        destruction just yet.
 | |
|      */
 | |
| 
 | |
|     if (inst->in_weakreflist != NULL)
 | |
|         PyObject_ClearWeakRefs((PyObject *) inst);
 | |
| 
 | |
|     /* Proceed with object destruction normally. */
 | |
| }
 | |
| \end{verbatim}
 |