mirror of
https://github.com/python/cpython.git
synced 2024-11-24 10:24:35 +08:00
a0dfa82eca
svn+ssh://pythondev@svn.python.org/python/trunk ........ r75149 | gregory.p.smith | 2009-09-29 16:56:31 -0500 (Tue, 29 Sep 2009) | 3 lines Mention issue6972 in extractall docs about overwriting things outside of the supplied path. ........ r75260 | andrew.kuchling | 2009-10-05 16:24:20 -0500 (Mon, 05 Oct 2009) | 1 line Wording fix ........ r75261 | andrew.kuchling | 2009-10-05 16:24:35 -0500 (Mon, 05 Oct 2009) | 1 line Fix narkup ........ r75262 | andrew.kuchling | 2009-10-05 16:25:03 -0500 (Mon, 05 Oct 2009) | 1 line Document 'skip' parameter to constructor ........ r75263 | andrew.kuchling | 2009-10-05 16:25:35 -0500 (Mon, 05 Oct 2009) | 1 line Note side benefit of socket.create_connection() ........ r75265 | andrew.kuchling | 2009-10-05 17:31:11 -0500 (Mon, 05 Oct 2009) | 1 line Reword sentence ........ r75266 | andrew.kuchling | 2009-10-05 17:32:48 -0500 (Mon, 05 Oct 2009) | 1 line Use standard comma punctuation; reword some sentences in the docs ........ r75267 | andrew.kuchling | 2009-10-05 17:42:56 -0500 (Mon, 05 Oct 2009) | 1 line Backport r73983: Document the thousands separator. ........ r75292 | benjamin.peterson | 2009-10-08 22:11:36 -0500 (Thu, 08 Oct 2009) | 1 line death to old CVS keyword ........ r75300 | benjamin.peterson | 2009-10-09 16:48:14 -0500 (Fri, 09 Oct 2009) | 1 line fix some coding style ........ r75376 | benjamin.peterson | 2009-10-11 20:26:07 -0500 (Sun, 11 Oct 2009) | 1 line platform we don't care about ........ r75405 | neil.schemenauer | 2009-10-14 12:17:14 -0500 (Wed, 14 Oct 2009) | 4 lines Issue #1754094: Improve the stack depth calculation in the compiler. There should be no other effect than a small decrease in memory use. Patch by Christopher Tur Lesniewski-Laas. ........ r75429 | benjamin.peterson | 2009-10-14 20:47:28 -0500 (Wed, 14 Oct 2009) | 1 line pep8ify if blocks ........ r75430 | benjamin.peterson | 2009-10-14 20:49:37 -0500 (Wed, 14 Oct 2009) | 1 line use floor division and add a test that exercises the tabsize codepath ........ r75431 | benjamin.peterson | 2009-10-14 20:56:25 -0500 (Wed, 14 Oct 2009) | 1 line change test to what I intended ........ r75432 | benjamin.peterson | 2009-10-14 22:05:39 -0500 (Wed, 14 Oct 2009) | 1 line some cleanups ........ r75433 | benjamin.peterson | 2009-10-14 22:06:55 -0500 (Wed, 14 Oct 2009) | 1 line make inspect.isabstract() always return a boolean; add a test for it, too #7069 ........ r75437 | benjamin.peterson | 2009-10-15 10:44:46 -0500 (Thu, 15 Oct 2009) | 1 line only clear a module's __dict__ if the module is the only one with a reference to it #7140 ........ r75445 | vinay.sajip | 2009-10-16 09:06:44 -0500 (Fri, 16 Oct 2009) | 1 line Issue #7120: logging: Removed import of multiprocessing which is causing crash in GAE. ........ r75501 | antoine.pitrou | 2009-10-18 13:37:11 -0500 (Sun, 18 Oct 2009) | 3 lines Add a comment about unreachable code, and fix a typo ........ r75551 | benjamin.peterson | 2009-10-19 22:14:10 -0500 (Mon, 19 Oct 2009) | 1 line use property api ........ r75572 | benjamin.peterson | 2009-10-20 16:55:17 -0500 (Tue, 20 Oct 2009) | 1 line clarify buffer arg #7178 ........ r75589 | benjamin.peterson | 2009-10-21 21:26:47 -0500 (Wed, 21 Oct 2009) | 1 line whitespace ........ r75590 | benjamin.peterson | 2009-10-21 21:36:47 -0500 (Wed, 21 Oct 2009) | 1 line rewrite to be nice to other implementations ........ r75591 | benjamin.peterson | 2009-10-21 21:50:38 -0500 (Wed, 21 Oct 2009) | 4 lines rewrite for style, clarify, and comments Also, use the hasattr() like scheme of allowing BaseException exceptions through. ........ r75657 | antoine.pitrou | 2009-10-24 07:41:27 -0500 (Sat, 24 Oct 2009) | 3 lines Fix compilation error in debug mode. ........ r75742 | benjamin.peterson | 2009-10-26 17:51:16 -0500 (Mon, 26 Oct 2009) | 1 line use 'is' instead of id() ........ r75868 | benjamin.peterson | 2009-10-27 15:59:18 -0500 (Tue, 27 Oct 2009) | 1 line test expect base classes ........ r75952 | georg.brandl | 2009-10-29 15:38:32 -0500 (Thu, 29 Oct 2009) | 1 line Use the correct function name in docstring. ........ r75953 | georg.brandl | 2009-10-29 15:39:50 -0500 (Thu, 29 Oct 2009) | 1 line Remove mention of the old -X command line switch. ........ r75954 | georg.brandl | 2009-10-29 15:53:00 -0500 (Thu, 29 Oct 2009) | 1 line Use constants instead of magic integers for test result. Do not re-run with --verbose3 for environment changing tests. ........ r75955 | georg.brandl | 2009-10-29 15:54:03 -0500 (Thu, 29 Oct 2009) | 1 line Use a single style for all the docstrings in the math module. ........ r75956 | georg.brandl | 2009-10-29 16:16:34 -0500 (Thu, 29 Oct 2009) | 1 line I do not think the "railroad" program mentioned is still available. ........ r75957 | georg.brandl | 2009-10-29 16:44:56 -0500 (Thu, 29 Oct 2009) | 1 line Fix constant name. ........ r76057 | benjamin.peterson | 2009-11-02 09:06:45 -0600 (Mon, 02 Nov 2009) | 1 line prevent a rather unlikely segfault ........ r76105 | georg.brandl | 2009-11-04 01:38:12 -0600 (Wed, 04 Nov 2009) | 1 line #7259: show correct equivalent for operator.i* operations in docstring; fix minor issues in operator docs. ........ r76139 | benjamin.peterson | 2009-11-06 19:04:38 -0600 (Fri, 06 Nov 2009) | 1 line spelling ........ r76143 | georg.brandl | 2009-11-07 02:26:07 -0600 (Sat, 07 Nov 2009) | 1 line #7271: fix typo. ........ r76162 | benjamin.peterson | 2009-11-08 22:10:53 -0600 (Sun, 08 Nov 2009) | 1 line discuss how to use -p ........ r76223 | georg.brandl | 2009-11-12 02:29:46 -0600 (Thu, 12 Nov 2009) | 1 line Give the profile module a module directive. ........
328 lines
12 KiB
ReStructuredText
328 lines
12 KiB
ReStructuredText
:mod:`weakref` --- Weak references
|
|
==================================
|
|
|
|
.. module:: weakref
|
|
:synopsis: 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öwis <martin@loewis.home.cs.tu-berlin.de>
|
|
.. sectionauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
|
|
|
|
|
|
The :mod:`weakref` module allows the Python programmer to create :dfn:`weak
|
|
references` to objects.
|
|
|
|
.. When making changes to the examples in this file, be sure to update
|
|
Lib/test/test_weakref.py::libreftest too!
|
|
|
|
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,
|
|
:term:`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 :mod:`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. :class:`WeakSet` implements the :class:`set` interface,
|
|
but keeps weak references to its elements, just like a
|
|
:class:`WeakKeyDictionary` does.
|
|
|
|
Most programs should find that using one of these weak container 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 :mod:`weakref` module for the benefit of advanced uses.
|
|
|
|
.. note::
|
|
|
|
Weak references to an object are cleared before the object's :meth:`__del__`
|
|
is called, to ensure that the weak reference callback (if any) finds the
|
|
object still alive.
|
|
|
|
Not all objects can be weakly referenced; those objects which can include class
|
|
instances, functions written in Python (but not in C), instance methods, sets,
|
|
frozensets, file objects, :term:`generator`\s, type objects, sockets, arrays,
|
|
deques, and regular expression pattern objects.
|
|
|
|
.. versionchanged:: 3.2
|
|
Added support for thread.lock and threading.Lock.
|
|
|
|
Several built-in types such as :class:`list` and :class:`dict` do not directly
|
|
support weak references but can add support through subclassing::
|
|
|
|
class Dict(dict):
|
|
pass
|
|
|
|
obj = Dict(red=1, green=2, blue=3) # this object is weak referenceable
|
|
|
|
Other built-in types such as :class:`tuple` and :class:`long` do not support
|
|
weak references even when subclassed (This is an implementation detail and may
|
|
be different across various Python implementations.).
|
|
|
|
Extension types can easily be made to support weak references; see
|
|
:ref:`weakref-support`.
|
|
|
|
|
|
.. class:: ref(object[, callback])
|
|
|
|
Return a weak reference to *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 :const:`None` to be
|
|
returned. If *callback* is provided and not :const:`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 :meth:`__del__` method.
|
|
|
|
Weak references are :term:`hashable` if the *object* is hashable. They will
|
|
maintain their hash value even after the *object* was deleted. If
|
|
:func:`hash` is called the first time only after the *object* was deleted,
|
|
the call will raise :exc:`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 *callback*). If either referent has been deleted,
|
|
the references are equal only if the reference objects are the same object.
|
|
|
|
This is a subclassable type rather than a factory function.
|
|
|
|
|
|
.. function:: proxy(object[, callback])
|
|
|
|
Return a proxy to *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
|
|
``ProxyType`` or ``CallableProxyType``, depending on whether *object* is
|
|
callable. Proxy objects are not :term:`hashable` regardless of the referent; this
|
|
avoids a number of problems related to their fundamentally mutable nature, and
|
|
prevent their use as dictionary keys. *callback* is the same as the parameter
|
|
of the same name to the :func:`ref` function.
|
|
|
|
|
|
.. function:: getweakrefcount(object)
|
|
|
|
Return the number of weak references and proxies which refer to *object*.
|
|
|
|
|
|
.. function:: getweakrefs(object)
|
|
|
|
Return a list of all weak reference and proxy objects which refer to *object*.
|
|
|
|
|
|
.. class:: WeakKeyDictionary([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).
|
|
|
|
: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.
|
|
|
|
|
|
.. method:: WeakKeyDictionary.keyrefs()
|
|
|
|
Return an :term:`iterator` that yields the weak references to the keys.
|
|
|
|
|
|
.. class:: WeakValueDictionary([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).
|
|
|
|
:class:`WeakValueDictionary` objects have the following additional methods.
|
|
These method have the same issues as the and :meth:`keyrefs` method of
|
|
:class:`WeakKeyDictionary` objects.
|
|
|
|
|
|
.. method:: WeakValueDictionary.valuerefs()
|
|
|
|
Return an :term:`iterator` that yields the weak references to the values.
|
|
|
|
|
|
.. class:: WeakSet([elements])
|
|
|
|
Set class that keeps weak references to its elements. An element will be
|
|
discarded when no strong reference to it exists any more.
|
|
|
|
|
|
.. data:: ReferenceType
|
|
|
|
The type object for weak references objects.
|
|
|
|
|
|
.. data:: ProxyType
|
|
|
|
The type object for proxies of objects which are not callable.
|
|
|
|
|
|
.. data:: CallableProxyType
|
|
|
|
The type object for proxies of callable objects.
|
|
|
|
|
|
.. data:: 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.
|
|
|
|
|
|
.. exception:: ReferenceError
|
|
|
|
Exception raised when a proxy object is used but the underlying object has been
|
|
collected. This is the same as the standard :exc:`ReferenceError` exception.
|
|
|
|
|
|
.. seealso::
|
|
|
|
:pep:`0205` - Weak References
|
|
The proposal and rationale for this feature, including links to earlier
|
|
implementations and information about similar features in other languages.
|
|
|
|
|
|
.. _weakref-objects:
|
|
|
|
Weak Reference Objects
|
|
----------------------
|
|
|
|
Weak reference objects have no attributes or methods, but do allow the referent
|
|
to be obtained, if it still exists, by calling it:
|
|
|
|
>>> import weakref
|
|
>>> class Object:
|
|
... pass
|
|
...
|
|
>>> o = Object()
|
|
>>> r = weakref.ref(o)
|
|
>>> o2 = r()
|
|
>>> o is o2
|
|
True
|
|
|
|
If the referent no longer exists, calling the reference object returns
|
|
:const:`None`:
|
|
|
|
>>> del o, o2
|
|
>>> print(r())
|
|
None
|
|
|
|
Testing that a weak reference object is still live should be done using the
|
|
expression ``ref() is not None``. Normally, application code that needs to use
|
|
a reference object should follow this pattern::
|
|
|
|
# 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()
|
|
|
|
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::
|
|
|
|
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.items():
|
|
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
|
|
|
|
|
|
.. _weakref-example:
|
|
|
|
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.
|
|
|
|
::
|
|
|
|
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]
|
|
|