#5037 proxy __unicode__ correctly

This commit is contained in:
Benjamin Peterson 2009-11-19 03:00:02 +00:00
parent 9eac119ba8
commit dc3c239b1e
3 changed files with 31 additions and 0 deletions

View File

@ -188,6 +188,17 @@ class ReferencesTestCase(TestBase):
self.assertEqual(L3[:5], p3[:5]) self.assertEqual(L3[:5], p3[:5])
self.assertEqual(L3[2:5], p3[2:5]) self.assertEqual(L3[2:5], p3[2:5])
def test_proxy_unicode(self):
# See bug 5037
class C(object):
def __str__(self):
return "string"
def __unicode__(self):
return u"unicode"
instance = C()
self.assertTrue("__unicode__" in dir(weakref.proxy(instance)))
self.assertEqual(unicode(weakref.proxy(instance)), u"unicode")
def test_proxy_index(self): def test_proxy_index(self):
class C: class C:
def __index__(self): def __index__(self):

View File

@ -440,6 +440,9 @@ Core and Builtins
Library Library
------- -------
- Issue #5037: Proxy the __unicode__ special method instead to __unicode__
instead of __str__.
- Issue #7341: Close the internal file object in the TarFile constructor in - Issue #7341: Close the internal file object in the TarFile constructor in
case of an error. case of an error.

View File

@ -433,6 +433,13 @@ proxy_checkref(PyWeakReference *proxy)
return generic(proxy, v, w); \ return generic(proxy, v, w); \
} }
#define WRAP_METHOD(method, special) \
static PyObject * \
method(PyObject *proxy) { \
UNWRAP(proxy); \
return PyObject_CallMethod(proxy, special, ""); \
}
/* direct slots */ /* direct slots */
@ -593,6 +600,15 @@ proxy_iternext(PyWeakReference *proxy)
} }
WRAP_METHOD(proxy_unicode, "__unicode__");
static PyMethodDef proxy_methods[] = {
{"__unicode__", (PyCFunction)proxy_unicode, METH_NOARGS},
{NULL, NULL}
};
static PyNumberMethods proxy_as_number = { static PyNumberMethods proxy_as_number = {
proxy_add, /*nb_add*/ proxy_add, /*nb_add*/
proxy_sub, /*nb_subtract*/ proxy_sub, /*nb_subtract*/
@ -684,6 +700,7 @@ _PyWeakref_ProxyType = {
0, /* tp_weaklistoffset */ 0, /* tp_weaklistoffset */
(getiterfunc)proxy_iter, /* tp_iter */ (getiterfunc)proxy_iter, /* tp_iter */
(iternextfunc)proxy_iternext, /* tp_iternext */ (iternextfunc)proxy_iternext, /* tp_iternext */
proxy_methods, /* tp_methods */
}; };