]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
backport doctest for weakref examples
authorGeorg Brandl <georg@python.org>
Sat, 2 Jul 2005 19:09:42 +0000 (19:09 +0000)
committerGeorg Brandl <georg@python.org>
Sat, 2 Jul 2005 19:09:42 +0000 (19:09 +0000)
Doc/lib/libweakref.tex
Lib/test/test_weakref.py

index 617540b048e77373efd6b1a06e2fd80b59043c7a..2f8ade0d01a2f0d7238f33b50cdcd9551d12c618 100644 (file)
@@ -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)
index 2754cec5a2c1c838146f0263a5da5ccf7329da4b..9634ef2d347a8019a96539554dd60ed90fdbb89a 100644 (file)
@@ -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__":