bpo-40277: Add a repr() to namedtuple's _tuplegetter to aid with introspection (GH-19537)
This commit is contained in:
parent
4f98f465f1
commit
a86b522d8f
|
@ -411,6 +411,18 @@ class TestNamedTuple(unittest.TestCase):
|
||||||
self.assertIs(P.m.__doc__, Q.o.__doc__)
|
self.assertIs(P.m.__doc__, Q.o.__doc__)
|
||||||
self.assertIs(P.n.__doc__, Q.p.__doc__)
|
self.assertIs(P.n.__doc__, Q.p.__doc__)
|
||||||
|
|
||||||
|
@support.cpython_only
|
||||||
|
def test_field_repr(self):
|
||||||
|
Point = namedtuple('Point', 'x y')
|
||||||
|
self.assertEqual(repr(Point.x), "_tuplegetter(0, 'Alias for field number 0')")
|
||||||
|
self.assertEqual(repr(Point.y), "_tuplegetter(1, 'Alias for field number 1')")
|
||||||
|
|
||||||
|
Point.x.__doc__ = 'The x-coordinate'
|
||||||
|
Point.y.__doc__ = 'The y-coordinate'
|
||||||
|
|
||||||
|
self.assertEqual(repr(Point.x), "_tuplegetter(0, 'The x-coordinate')")
|
||||||
|
self.assertEqual(repr(Point.y), "_tuplegetter(1, 'The y-coordinate')")
|
||||||
|
|
||||||
def test_name_fixer(self):
|
def test_name_fixer(self):
|
||||||
for spec, renamed in [
|
for spec, renamed in [
|
||||||
[('efg', 'g%hi'), ('efg', '_1')], # field with non-alpha char
|
[('efg', 'g%hi'), ('efg', '_1')], # field with non-alpha char
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
:func:`collections.namedtuple` now provides a human-readable repr for its
|
||||||
|
field accessors.
|
|
@ -2493,6 +2493,14 @@ tuplegetter_reduce(_tuplegetterobject *self, PyObject *Py_UNUSED(ignored))
|
||||||
return Py_BuildValue("(O(nO))", (PyObject*) Py_TYPE(self), self->index, self->doc);
|
return Py_BuildValue("(O(nO))", (PyObject*) Py_TYPE(self), self->index, self->doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject*
|
||||||
|
tuplegetter_repr(_tuplegetterobject *self)
|
||||||
|
{
|
||||||
|
return PyUnicode_FromFormat("%s(%zd, %R)",
|
||||||
|
_PyType_Name(Py_TYPE(self)),
|
||||||
|
self->index, self->doc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static PyMemberDef tuplegetter_members[] = {
|
static PyMemberDef tuplegetter_members[] = {
|
||||||
{"__doc__", T_OBJECT, offsetof(_tuplegetterobject, doc), 0},
|
{"__doc__", T_OBJECT, offsetof(_tuplegetterobject, doc), 0},
|
||||||
|
@ -2515,7 +2523,7 @@ static PyTypeObject tuplegetter_type = {
|
||||||
0, /* tp_getattr */
|
0, /* tp_getattr */
|
||||||
0, /* tp_setattr */
|
0, /* tp_setattr */
|
||||||
0, /* tp_as_async */
|
0, /* tp_as_async */
|
||||||
0, /* tp_repr */
|
(reprfunc)tuplegetter_repr, /* tp_repr */
|
||||||
0, /* tp_as_number */
|
0, /* tp_as_number */
|
||||||
0, /* tp_as_sequence */
|
0, /* tp_as_sequence */
|
||||||
0, /* tp_as_mapping */
|
0, /* tp_as_mapping */
|
||||||
|
|
Loading…
Reference in New Issue