diff options
-rw-r--r-- | Doc/lib/libweakref.tex | 6 | ||||
-rw-r--r-- | Lib/test/test_weakref.py | 86 |
2 files changed, 90 insertions, 2 deletions
diff --git a/Doc/lib/libweakref.tex b/Doc/lib/libweakref.tex index 617540b..2f8ade0 100644 --- a/Doc/lib/libweakref.tex +++ b/Doc/lib/libweakref.tex @@ -10,6 +10,8 @@ \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. @@ -228,7 +230,7 @@ this pattern: o = r() if o is None: # referent has been garbage collected - print "Object has been allocated; can't frobnicate." + print "Object has been deallocated; can't frobnicate." else: print "Object is still live!" o.do_something_useful() @@ -265,7 +267,7 @@ class ExtendedRef(weakref.ref): """Return a pair containing the referent and the number of times the reference has been called. """ - ob = super(ExtendedRef, self)() + ob = super(ExtendedRef, self).__call__() if ob is not None: self.__counter += 1 ob = (ob, self.__counter) diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py index 2754cec..9634ef2 100644 --- a/Lib/test/test_weakref.py +++ b/Lib/test/test_weakref.py @@ -1001,6 +1001,91 @@ class WeakKeyDictionaryTestCase(mapping_tests.BasicTestMappingProtocol): def _reference(self): return self.__ref.copy() +libreftest = """ Doctest for examples in the library reference: libweakref.tex + +>>> import weakref +>>> class Dict(dict): +... pass +... +>>> obj = Dict(red=1, green=2, blue=3) # this object is weak referencable +>>> r = weakref.ref(obj) +>>> print r() +{'blue': 3, 'green': 2, 'red': 1} + +>>> import weakref +>>> class Object: +... pass +... +>>> o = Object() +>>> r = weakref.ref(o) +>>> o2 = r() +>>> o is o2 +True +>>> del o, o2 +>>> print r() +None + +>>> 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 +... +>>> class A: # not in docs from here, just testing the ExtendedRef +... pass +... +>>> a = A() +>>> r = ExtendedRef(a, foo=1, bar="baz") +>>> r.foo +1 +>>> r.bar +'baz' +>>> r()[1] +1 +>>> r()[1] +2 +>>> r()[0] is a +True + + +>>> 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] +... +>>> a = A() # from here, just testing +>>> a_id = remember(a) +>>> id2obj(a_id) is a +True +>>> del a +>>> try: +... id2obj(a_id) +... except KeyError: +... print 'OK' +... else: +... print 'WeakValueDictionary error' +OK + +""" + +__test__ = {'libreftest' : libreftest} + def test_main(): test_support.run_unittest( ReferencesTestCase, @@ -1008,6 +1093,7 @@ def test_main(): WeakValueDictionaryTestCase, WeakKeyDictionaryTestCase, ) + test_support.run_doctest(sys.modules[__name__]) if __name__ == "__main__": |