Commit 01fc6cd0 authored by Benjamin Peterson's avatar Benjamin Peterson

make __doc__ mutable on heaptypes (closes #12773)

parent d9f23d20
...@@ -4261,6 +4261,19 @@ order (MRO) for bases """ ...@@ -4261,6 +4261,19 @@ order (MRO) for bases """
m = str(cm.exception) m = str(cm.exception)
self.assertEqual("'foo' in __slots__ conflicts with class variable", m) self.assertEqual("'foo' in __slots__ conflicts with class variable", m)
def test_set_doc(self):
class X:
"elephant"
X.__doc__ = "banana"
self.assertEqual(X.__doc__, "banana")
with self.assertRaises(TypeError) as cm:
type(list).__dict__["__doc__"].__set__(list, "blah")
self.assertIn("can't set list.__doc__", str(cm.exception))
with self.assertRaises(TypeError) as cm:
type(X).__dict__["__doc__"].__delete__(X)
self.assertIn("can't delete X.__doc__", str(cm.exception))
self.assertEqual(X.__doc__, "banana")
class DictProxyTests(unittest.TestCase): class DictProxyTests(unittest.TestCase):
def setUp(self): def setUp(self):
class C(object): class C(object):
......
...@@ -10,6 +10,8 @@ What's New in Python 3.3 Alpha 1? ...@@ -10,6 +10,8 @@ What's New in Python 3.3 Alpha 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #12773: Make __doc__ mutable on user-defined classes.
- Issue #12766: Raise an ValueError when creating a class with a class variable - Issue #12766: Raise an ValueError when creating a class with a class variable
that conflicts with a name in __slots__. that conflicts with a name in __slots__.
......
...@@ -588,6 +588,15 @@ type_get_doc(PyTypeObject *type, void *context) ...@@ -588,6 +588,15 @@ type_get_doc(PyTypeObject *type, void *context)
return result; return result;
} }
static int
type_set_doc(PyTypeObject *type, PyObject *value, void *context)
{
if (!check_set_special_type_attr(type, value, "__doc__"))
return -1;
PyType_Modified(type);
return PyDict_SetItemString(type->tp_dict, "__doc__", value);
}
static PyObject * static PyObject *
type___instancecheck__(PyObject *type, PyObject *inst) type___instancecheck__(PyObject *type, PyObject *inst)
{ {
...@@ -623,7 +632,7 @@ static PyGetSetDef type_getsets[] = { ...@@ -623,7 +632,7 @@ static PyGetSetDef type_getsets[] = {
{"__abstractmethods__", (getter)type_abstractmethods, {"__abstractmethods__", (getter)type_abstractmethods,
(setter)type_set_abstractmethods, NULL}, (setter)type_set_abstractmethods, NULL},
{"__dict__", (getter)type_dict, NULL, NULL}, {"__dict__", (getter)type_dict, NULL, NULL},
{"__doc__", (getter)type_get_doc, NULL, NULL}, {"__doc__", (getter)type_get_doc, (setter)type_set_doc, NULL},
{0} {0}
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment