Not all objects can be weakly referenced; those objects which can
include class instances, functions written in Python (but not in C),
-and methods (both bound and unbound). Extension types can easily
-be made to support weak references; see section \ref{weakref-extension},
-``Weak References in Extension Types,'' for more information.
+methods (both bound and unbound), sets, frozensets, file objects,
+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.
\begin{funcdesc}{ref}{object\optional{, callback}}
__doc__ = _realsocket.__doc__
- __slots__ = ["_sock", "send", "recv", "sendto", "recvfrom"]
+ __slots__ = ["_sock", "send", "recv", "sendto", "recvfrom",
+ "__weakref__"]
def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
if _sock is None:
import re
from sre import Scanner
import sys, os, traceback
+from weakref import proxy
# Misc tests from Tim Peters' re.doc
import unittest
class ReTests(unittest.TestCase):
+
+ def test_weakref(self):
+ s = 'QabbbcR'
+ x = re.compile('ab+c')
+ y = proxy(x)
+ self.assertEqual(x.findall('QabbbcR'), y.findall('QabbbcR'))
+
def test_search_star_plus(self):
self.assertEqual(re.search('x*', 'axx').span(0), (0, 0))
self.assertEqual(re.search('x*', 'axx').span(), (0, 0))
import thread, threading
import Queue
import sys
+from weakref import proxy
PORT = 50007
HOST = 'localhost'
class GeneralModuleTests(unittest.TestCase):
+ def test_weakref(self):
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ p = proxy(s)
+ self.assertEqual(p.fileno(), s.fileno())
+ s.close()
+ s = None
+ try:
+ p.fileno()
+ except ReferenceError:
+ pass
+ else:
+ self.fail('Socket proxy still exists')
+
def testSocketError(self):
# Testing socket module exceptions
def raise_error(*args, **kwargs):
Extension modules
-----------------
+- the weakref module now supports additional objects: array.array,
+ sre.pattern_objects, file objects, and sockets.
+
- operator.isMappingType() and operator.isSequenceType() now give
fewer false positives.
Py_XINCREF(indexgroup);
self->indexgroup = indexgroup;
+ self->weakreflist = NULL;
+
return (PyObject*) self;
}
static void
pattern_dealloc(PatternObject* self)
{
+ if (self->weakreflist != NULL)
+ PyObject_ClearWeakRefs((PyObject *) self);
Py_XDECREF(self->pattern);
Py_XDECREF(self->groupindex);
Py_XDECREF(self->indexgroup);
memcpy((char*) copy + offset, (char*) self + offset,
sizeof(PatternObject) + self->codesize * sizeof(SRE_CODE) - offset);
+ copy->weakreflist = NULL;
return (PyObject*) copy;
#else
sizeof(PatternObject), sizeof(SRE_CODE),
(destructor)pattern_dealloc, /*tp_dealloc*/
0, /*tp_print*/
- (getattrfunc)pattern_getattr /*tp_getattr*/
+ (getattrfunc)pattern_getattr, /*tp_getattr*/
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ offsetof(PatternObject, weakreflist), /* tp_weaklistoffset */
};
/* -------------------------------------------------------------------- */
/* compatibility */
PyObject* pattern; /* pattern source (or None) */
int flags; /* flags used when compiling pattern source */
+ PyObject *weakreflist; /* List of weak references */
/* pattern code */
int codesize;
SRE_CODE code[1];