| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | \section{\module{weakref} --- | 
					
						
							|  |  |  |          Weak references} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \declaremodule{extension}{weakref} | 
					
						
							| 
									
										
										
										
											2001-04-11 19:17:11 +00:00
										 |  |  | \modulesynopsis{Support for weak references and weak dictionaries.} | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | \moduleauthor{Fred L. Drake, Jr.}{fdrake@acm.org} | 
					
						
							| 
									
										
										
										
											2001-02-27 18:36:56 +00:00
										 |  |  | \moduleauthor{Neil Schemenauer}{nas@arctrix.com} | 
					
						
							| 
									
										
										
										
											2001-06-29 16:25:07 +00:00
										 |  |  | \moduleauthor{Martin von L\"owis}{martin@loewis.home.cs.tu-berlin.de} | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | \sectionauthor{Fred L. Drake, Jr.}{fdrake@acm.org} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \versionadded{2.1} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-02 19:07:30 +00:00
										 |  |  | % When making changes to the examples in this file, be sure to update
 | 
					
						
							|  |  |  | % Lib/test/test_weakref.py::libreftest too!
 | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | The \module{weakref} module allows the Python programmer to create | 
					
						
							|  |  |  | \dfn{weak references} to objects. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-11-21 22:20:57 +00:00
										 |  |  | In the following, the term \dfn{referent} means the | 
					
						
							| 
									
										
										
										
											2001-10-26 17:40:22 +00:00
										 |  |  | object which is referred to by a weak reference. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-11-21 22:20:57 +00:00
										 |  |  | 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. | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-07-02 15:10:38 +00:00
										 |  |  | Not all objects can be weakly referenced; those objects which can | 
					
						
							| 
									
										
										
										
											2001-03-23 04:36:02 +00:00
										 |  |  | include class instances, functions written in Python (but not in C), | 
					
						
							| 
									
										
										
										
											2004-05-31 03:09:25 +00:00
										 |  |  | methods (both bound and unbound), sets, frozensets, file objects, | 
					
						
							| 
									
										
										
										
											2004-06-12 06:56:44 +00:00
										 |  |  | generators, type objects, DBcursor objects from the \module{bsddb} module, | 
					
						
							| 
									
										
										
										
											2004-05-31 03:09:25 +00:00
										 |  |  | 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 section | 
					
						
							|  |  |  | \ref{weakref-extension}, ``Weak References in Extension Types,'' for more | 
					
						
							|  |  |  | information. | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-02 18:57:45 +00:00
										 |  |  | \begin{classdesc}{ref}{object\optional{, callback}} | 
					
						
							| 
									
										
										
										
											2001-10-26 17:40:22 +00:00
										 |  |  |   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 | 
					
						
							| 
									
										
										
										
											2004-02-03 20:55:15 +00:00
										 |  |  |   object will cause \constant{None} to be returned.  If \var{callback} is | 
					
						
							| 
									
										
										
										
											2005-12-29 17:43:08 +00:00
										 |  |  |   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 | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  |   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 | 
					
						
							| 
									
										
										
										
											2001-02-14 02:39:11 +00:00
										 |  |  |   error output, but cannot be propagated; they are handled in exactly | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  |   the same way as exceptions raised from an object's | 
					
						
							|  |  |  |   \method{__del__()} method. | 
					
						
							| 
									
										
										
										
											2003-11-21 22:20:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-27 18:36:56 +00:00
										 |  |  |   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}. | 
					
						
							| 
									
										
										
										
											2003-11-21 22:20:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-26 03:00:39 +00:00
										 |  |  |   Weak references support tests for equality, but not ordering.  If | 
					
						
							| 
									
										
										
										
											2001-10-26 17:40:22 +00:00
										 |  |  |   the referents are still alive, two references have the same | 
					
						
							| 
									
										
										
										
											2001-11-26 21:39:40 +00:00
										 |  |  |   equality relationship as their referents (regardless of the | 
					
						
							| 
									
										
										
										
											2001-10-26 17:40:22 +00:00
										 |  |  |   \var{callback}).  If either referent has been deleted, the | 
					
						
							|  |  |  |   references are equal only if the reference objects are the same | 
					
						
							|  |  |  |   object. | 
					
						
							| 
									
										
										
										
											2004-07-02 18:57:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   \versionchanged[This is now a subclassable type rather than a | 
					
						
							|  |  |  |                   factory function; it derives from \class{object}] | 
					
						
							|  |  |  |                   {2.4} | 
					
						
							|  |  |  | \end{classdesc} | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \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 | 
					
						
							| 
									
										
										
										
											2001-05-10 17:22:17 +00:00
										 |  |  |   keys.  \var{callback} is the same as the parameter of the same name | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  |   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} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-27 18:36:56 +00:00
										 |  |  | \begin{classdesc}{WeakKeyDictionary}{\optional{dict}} | 
					
						
							| 
									
										
										
										
											2001-04-10 19:57:58 +00:00
										 |  |  |   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. | 
					
						
							| 
									
										
										
										
											2003-11-21 22:20:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   \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).} | 
					
						
							| 
									
										
										
										
											2001-02-27 18:36:56 +00:00
										 |  |  | \end{classdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{classdesc}{WeakValueDictionary}{\optional{dict}} | 
					
						
							| 
									
										
										
										
											2001-04-10 19:57:58 +00:00
										 |  |  |   Mapping class that references values weakly.  Entries in the | 
					
						
							|  |  |  |   dictionary will be discarded when no strong reference to the value | 
					
						
							| 
									
										
										
										
											2001-10-26 17:40:22 +00:00
										 |  |  |   exists any more. | 
					
						
							| 
									
										
										
										
											2003-11-21 22:20:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   \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).} | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | \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} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-10 19:57:58 +00:00
										 |  |  | \begin{excdesc}{ReferenceError} | 
					
						
							|  |  |  |   Exception raised when a proxy object is used but the underlying | 
					
						
							| 
									
										
										
										
											2001-10-06 06:10:54 +00:00
										 |  |  |   object has been collected.  This is the same as the standard | 
					
						
							|  |  |  |   \exception{ReferenceError} exception. | 
					
						
							| 
									
										
										
										
											2001-04-10 19:57:58 +00:00
										 |  |  | \end{excdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \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 | 
					
						
							| 
									
										
										
										
											2003-11-27 19:48:03 +00:00
										 |  |  | True | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | \end{verbatim} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If the referent no longer exists, calling the reference object returns | 
					
						
							| 
									
										
										
										
											2004-02-03 20:55:15 +00:00
										 |  |  | \constant{None}: | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \begin{verbatim} | 
					
						
							|  |  |  | >>> del o, o2 | 
					
						
							|  |  |  | >>> print r() | 
					
						
							|  |  |  | None | 
					
						
							|  |  |  | \end{verbatim} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Testing that a weak reference object is still live should be done | 
					
						
							| 
									
										
										
										
											2001-08-03 03:50:28 +00:00
										 |  |  | using the expression \code{\var{ref}() is not None}.  Normally, | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | application code that needs to use a reference object should follow | 
					
						
							|  |  |  | this pattern: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{verbatim} | 
					
						
							| 
									
										
										
										
											2001-10-26 17:40:22 +00:00
										 |  |  | # r is a weak reference object | 
					
						
							|  |  |  | o = r() | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | if o is None: | 
					
						
							|  |  |  |     # referent has been garbage collected | 
					
						
							| 
									
										
										
										
											2005-07-02 19:07:30 +00:00
										 |  |  |     print "Object has been deallocated; can't frobnicate." | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2001-10-26 17:40:22 +00:00
										 |  |  | become invalidated before the weak reference is called; the | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | idiom shown above is safe in threaded applications as well as | 
					
						
							|  |  |  | single-threaded applications. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-02 18:57:45 +00:00
										 |  |  | 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) | 
					
						
							| 
									
										
										
										
											2005-07-02 10:44:32 +00:00
										 |  |  |         self.__counter = 0 | 
					
						
							|  |  |  |         for k, v in annotations.iteritems(): | 
					
						
							| 
									
										
										
										
											2004-07-02 18:57:45 +00:00
										 |  |  |             setattr(self, k, v) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __call__(self): | 
					
						
							|  |  |  |         """Return a pair containing the referent and the number of | 
					
						
							|  |  |  |         times the reference has been called. | 
					
						
							|  |  |  |         """ | 
					
						
							| 
									
										
										
										
											2005-07-02 19:07:30 +00:00
										 |  |  |         ob = super(ExtendedRef, self).__call__() | 
					
						
							| 
									
										
										
										
											2004-07-02 18:57:45 +00:00
										 |  |  |         if ob is not None: | 
					
						
							|  |  |  |             self.__counter += 1 | 
					
						
							|  |  |  |             ob = (ob, self.__counter) | 
					
						
							|  |  |  |         return ob | 
					
						
							|  |  |  | \end{verbatim} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-03-28 21:15:41 +00:00
										 |  |  | \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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-12-30 16:15:35 +00:00
										 |  |  | % Example contributed by Tim Peters.
 | 
					
						
							| 
									
										
										
										
											2001-03-28 21:15:41 +00:00
										 |  |  | \begin{verbatim} | 
					
						
							|  |  |  | import weakref | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-10 19:57:58 +00:00
										 |  |  | _id2obj_dict = weakref.WeakValueDictionary() | 
					
						
							| 
									
										
										
										
											2001-03-28 21:15:41 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def remember(obj): | 
					
						
							| 
									
										
										
										
											2001-10-26 17:40:22 +00:00
										 |  |  |     oid = id(obj) | 
					
						
							|  |  |  |     _id2obj_dict[oid] = obj | 
					
						
							|  |  |  |     return oid | 
					
						
							| 
									
										
										
										
											2001-03-28 21:15:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-26 17:40:22 +00:00
										 |  |  | def id2obj(oid): | 
					
						
							|  |  |  |     return _id2obj_dict[oid] | 
					
						
							| 
									
										
										
										
											2001-03-28 21:15:41 +00:00
										 |  |  | \end{verbatim} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | \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 | 
					
						
							| 
									
										
										
										
											2001-10-26 17:40:22 +00:00
										 |  |  | \ctype{PyObject*} field in the instance structure for the use of the | 
					
						
							| 
									
										
										
										
											2001-03-23 04:36:02 +00:00
										 |  |  | weak reference mechanism; it must be initialized to \NULL{} by the | 
					
						
							|  |  |  | object's constructor.  It must also set the \member{tp_weaklistoffset} | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | field of the corresponding type object to the offset of the field. | 
					
						
							| 
									
										
										
										
											2002-08-07 16:18:54 +00:00
										 |  |  | Also, it needs to add \constant{Py_TPFLAGS_HAVE_WEAKREFS} to the | 
					
						
							|  |  |  | tp_flags slot.  For example, the instance type is defined with the | 
					
						
							|  |  |  | following structure: | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \begin{verbatim} | 
					
						
							|  |  |  | typedef struct { | 
					
						
							|  |  |  |     PyObject_HEAD | 
					
						
							|  |  |  |     PyClassObject *in_class;       /* The class object */ | 
					
						
							| 
									
										
										
										
											2001-02-27 18:36:56 +00:00
										 |  |  |     PyObject      *in_dict;        /* A dictionary */ | 
					
						
							|  |  |  |     PyObject      *in_weakreflist; /* List of weak references */ | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | } 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, | 
					
						
							| 
									
										
										
										
											2001-12-08 18:02:58 +00:00
										 |  |  |     "module.instance", | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-06-22 17:20:29 +00:00
										 |  |  |     /* Lots of stuff omitted for brevity... */ | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-07 16:18:54 +00:00
										 |  |  |     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_WEAKREFS   /* tp_flags */ | 
					
						
							|  |  |  |     0,                                          /* tp_doc */ | 
					
						
							|  |  |  |     0,                                          /* tp_traverse */ | 
					
						
							|  |  |  |     0,                                          /* tp_clear */ | 
					
						
							|  |  |  |     0,                                          /* tp_richcompare */ | 
					
						
							|  |  |  |     offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */ | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | \end{verbatim} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-07 16:18:54 +00:00
										 |  |  | The type constructor is responsible for initializing the weak reference | 
					
						
							|  |  |  | list to \NULL: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{verbatim} | 
					
						
							| 
									
										
										
										
											2003-11-21 22:20:57 +00:00
										 |  |  | static PyObject * | 
					
						
							|  |  |  | instance_new() { | 
					
						
							|  |  |  |     /* Other initialization stuff omitted for brevity */ | 
					
						
							| 
									
										
										
										
											2002-08-07 16:18:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-11-21 22:20:57 +00:00
										 |  |  |     self->in_weakreflist = NULL; | 
					
						
							| 
									
										
										
										
											2002-08-07 16:18:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-11-21 22:20:57 +00:00
										 |  |  |     return (PyObject *) self; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2002-08-07 16:18:54 +00:00
										 |  |  | \end{verbatim} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | The only further addition is that the destructor needs to call the | 
					
						
							| 
									
										
										
										
											2001-06-22 17:20:29 +00:00
										 |  |  | weak reference manager to clear any weak references.  This should be | 
					
						
							| 
									
										
										
										
											2001-10-26 17:40:22 +00:00
										 |  |  | done before any other parts of the destruction have occurred, but is | 
					
						
							|  |  |  | only required if the weak reference list is non-\NULL: | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \begin{verbatim} | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | instance_dealloc(PyInstanceObject *inst) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2001-10-26 17:40:22 +00:00
										 |  |  |     /* Allocate temporaries if needed, but do not begin | 
					
						
							| 
									
										
										
										
											2001-06-22 17:20:29 +00:00
										 |  |  |        destruction just yet. | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-26 17:40:22 +00:00
										 |  |  |     if (inst->in_weakreflist != NULL) | 
					
						
							|  |  |  |         PyObject_ClearWeakRefs((PyObject *) inst); | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-26 11:27:54 +00:00
										 |  |  |     /* Proceed with object destruction normally. */ | 
					
						
							| 
									
										
										
										
											2001-02-01 05:20:20 +00:00
										 |  |  | } | 
					
						
							|  |  |  | \end{verbatim} |