mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
gh-107406: Add better struct.Struct
repr (#107407)
This commit is contained in:
parent
8ba4714611
commit
e407cea193
4 changed files with 29 additions and 0 deletions
|
@ -1,6 +1,10 @@
|
||||||
:mod:`struct` --- Interpret bytes as packed binary data
|
:mod:`struct` --- Interpret bytes as packed binary data
|
||||||
=======================================================
|
=======================================================
|
||||||
|
|
||||||
|
.. testsetup:: *
|
||||||
|
|
||||||
|
from struct import *
|
||||||
|
|
||||||
.. module:: struct
|
.. module:: struct
|
||||||
:synopsis: Interpret bytes as packed binary data.
|
:synopsis: Interpret bytes as packed binary data.
|
||||||
|
|
||||||
|
@ -597,6 +601,11 @@ The :mod:`struct` module also defines the following type:
|
||||||
The calculated size of the struct (and hence of the bytes object produced
|
The calculated size of the struct (and hence of the bytes object produced
|
||||||
by the :meth:`pack` method) corresponding to :attr:`format`.
|
by the :meth:`pack` method) corresponding to :attr:`format`.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.13 The *repr()* of structs has changed. It
|
||||||
|
is now:
|
||||||
|
|
||||||
|
>>> Struct('i')
|
||||||
|
Struct('i')
|
||||||
|
|
||||||
.. _half precision format: https://en.wikipedia.org/wiki/Half-precision_floating-point_format
|
.. _half precision format: https://en.wikipedia.org/wiki/Half-precision_floating-point_format
|
||||||
|
|
||||||
|
|
|
@ -774,6 +774,10 @@ class StructTest(unittest.TestCase):
|
||||||
test_error_propagation('N')
|
test_error_propagation('N')
|
||||||
test_error_propagation('n')
|
test_error_propagation('n')
|
||||||
|
|
||||||
|
def test_repr(self):
|
||||||
|
s = struct.Struct('=i2H')
|
||||||
|
self.assertEqual(repr(s), f'Struct({s.format!r})')
|
||||||
|
|
||||||
class UnpackIteratorTest(unittest.TestCase):
|
class UnpackIteratorTest(unittest.TestCase):
|
||||||
"""
|
"""
|
||||||
Tests for iterative unpacking (struct.Struct.iter_unpack).
|
Tests for iterative unpacking (struct.Struct.iter_unpack).
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Implement new :meth:`__repr__` method for :class:`struct.Struct`.
|
||||||
|
Now it returns ``Struct(<format repr>)``.
|
|
@ -2165,6 +2165,19 @@ s_sizeof(PyStructObject *self, void *unused)
|
||||||
return PyLong_FromSize_t(size);
|
return PyLong_FromSize_t(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
s_repr(PyStructObject *self)
|
||||||
|
{
|
||||||
|
PyObject* fmt = PyUnicode_FromStringAndSize(
|
||||||
|
PyBytes_AS_STRING(self->s_format), PyBytes_GET_SIZE(self->s_format));
|
||||||
|
if (fmt == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
PyObject* s = PyUnicode_FromFormat("%s(%R)", _PyType_Name(Py_TYPE(self)), fmt);
|
||||||
|
Py_DECREF(fmt);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
/* List of functions */
|
/* List of functions */
|
||||||
|
|
||||||
static struct PyMethodDef s_methods[] = {
|
static struct PyMethodDef s_methods[] = {
|
||||||
|
@ -2197,6 +2210,7 @@ static PyType_Slot PyStructType_slots[] = {
|
||||||
{Py_tp_dealloc, s_dealloc},
|
{Py_tp_dealloc, s_dealloc},
|
||||||
{Py_tp_getattro, PyObject_GenericGetAttr},
|
{Py_tp_getattro, PyObject_GenericGetAttr},
|
||||||
{Py_tp_setattro, PyObject_GenericSetAttr},
|
{Py_tp_setattro, PyObject_GenericSetAttr},
|
||||||
|
{Py_tp_repr, s_repr},
|
||||||
{Py_tp_doc, (void*)s__doc__},
|
{Py_tp_doc, (void*)s__doc__},
|
||||||
{Py_tp_traverse, s_traverse},
|
{Py_tp_traverse, s_traverse},
|
||||||
{Py_tp_clear, s_clear},
|
{Py_tp_clear, s_clear},
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue