mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Issue #17643: Add __callback__ attribute to weakref.ref.
This commit is contained in:
parent
548677bb8c
commit
556e94b8fe
4 changed files with 44 additions and 3 deletions
|
@ -111,6 +111,15 @@ Extension types can easily be made to support weak references; see
|
||||||
|
|
||||||
This is a subclassable type rather than a factory function.
|
This is a subclassable type rather than a factory function.
|
||||||
|
|
||||||
|
.. attribute:: __callback__
|
||||||
|
|
||||||
|
This read-only attribute returns the callback currently associated to the
|
||||||
|
weakref. If there is no callback or if the referent of the weakref is
|
||||||
|
no longer alive then this attribute will have value ``None``.
|
||||||
|
|
||||||
|
.. versionadded:: 3.4
|
||||||
|
Added the :attr:`__callback__` attribute.
|
||||||
|
|
||||||
|
|
||||||
.. function:: proxy(object[, callback])
|
.. function:: proxy(object[, callback])
|
||||||
|
|
||||||
|
@ -261,8 +270,9 @@ These method have the same issues as the and :meth:`keyrefs` method of
|
||||||
Weak Reference Objects
|
Weak Reference Objects
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
Weak reference objects have no attributes or methods, but do allow the referent
|
Weak reference objects have no methods and no attributes besides
|
||||||
to be obtained, if it still exists, by calling it:
|
:attr:`ref.__callback__`. A weak reference object allows the referent to be
|
||||||
|
obtained, if it still exists, by calling it:
|
||||||
|
|
||||||
>>> import weakref
|
>>> import weakref
|
||||||
>>> class Object:
|
>>> class Object:
|
||||||
|
|
|
@ -802,6 +802,30 @@ class ReferencesTestCase(TestBase):
|
||||||
del root
|
del root
|
||||||
gc.collect()
|
gc.collect()
|
||||||
|
|
||||||
|
def test_callback_attribute(self):
|
||||||
|
x = Object(1)
|
||||||
|
callback = lambda ref: None
|
||||||
|
ref1 = weakref.ref(x, callback)
|
||||||
|
self.assertIs(ref1.__callback__, callback)
|
||||||
|
|
||||||
|
ref2 = weakref.ref(x)
|
||||||
|
self.assertIsNone(ref2.__callback__)
|
||||||
|
|
||||||
|
def test_callback_attribute_after_deletion(self):
|
||||||
|
x = Object(1)
|
||||||
|
ref = weakref.ref(x, self.callback)
|
||||||
|
self.assertIsNotNone(ref.__callback__)
|
||||||
|
del x
|
||||||
|
support.gc_collect()
|
||||||
|
self.assertIsNone(ref.__callback__)
|
||||||
|
|
||||||
|
def test_set_callback_attribute(self):
|
||||||
|
x = Object(1)
|
||||||
|
callback = lambda ref: None
|
||||||
|
ref1 = weakref.ref(x, callback)
|
||||||
|
with self.assertRaises(AttributeError):
|
||||||
|
ref1.__callback__ = lambda ref: None
|
||||||
|
|
||||||
|
|
||||||
class SubclassableWeakrefTestCase(TestBase):
|
class SubclassableWeakrefTestCase(TestBase):
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@ What's New in Python 3.4.0 Alpha 1?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #17643: Add __callback__ attribute to weakref.ref.
|
||||||
|
|
||||||
- Issue #16447: Fixed potential segmentation fault when setting __name__ on a
|
- Issue #16447: Fixed potential segmentation fault when setting __name__ on a
|
||||||
class.
|
class.
|
||||||
|
|
||||||
|
|
|
@ -338,6 +338,11 @@ weakref___init__(PyObject *self, PyObject *args, PyObject *kwargs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static PyMemberDef weakref_members[] = {
|
||||||
|
{"__callback__", T_OBJECT, offsetof(PyWeakReference, wr_callback), READONLY},
|
||||||
|
{NULL} /* Sentinel */
|
||||||
|
};
|
||||||
|
|
||||||
PyTypeObject
|
PyTypeObject
|
||||||
_PyWeakref_RefType = {
|
_PyWeakref_RefType = {
|
||||||
PyVarObject_HEAD_INIT(&PyType_Type, 0)
|
PyVarObject_HEAD_INIT(&PyType_Type, 0)
|
||||||
|
@ -369,7 +374,7 @@ _PyWeakref_RefType = {
|
||||||
0, /*tp_iter*/
|
0, /*tp_iter*/
|
||||||
0, /*tp_iternext*/
|
0, /*tp_iternext*/
|
||||||
0, /*tp_methods*/
|
0, /*tp_methods*/
|
||||||
0, /*tp_members*/
|
weakref_members, /*tp_members*/
|
||||||
0, /*tp_getset*/
|
0, /*tp_getset*/
|
||||||
0, /*tp_base*/
|
0, /*tp_base*/
|
||||||
0, /*tp_dict*/
|
0, /*tp_dict*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue