summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/struct.rst9
-rw-r--r--Lib/test/test_struct.py4
-rw-r--r--Misc/NEWS.d/next/Library/2023-07-29-02-01-24.gh-issue-107406.ze6sQP.rst2
-rw-r--r--Modules/_struct.c14
4 files changed, 29 insertions, 0 deletions
diff --git a/Doc/library/struct.rst b/Doc/library/struct.rst
index c94dfde..e2e6fc5 100644
--- a/Doc/library/struct.rst
+++ b/Doc/library/struct.rst
@@ -1,6 +1,10 @@
:mod:`struct` --- Interpret bytes as packed binary data
=======================================================
+.. testsetup:: *
+
+ from struct import *
+
.. module:: struct
: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
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
diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py
index 6b1f22f..c76649c 100644
--- a/Lib/test/test_struct.py
+++ b/Lib/test/test_struct.py
@@ -774,6 +774,10 @@ class StructTest(unittest.TestCase):
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):
"""
Tests for iterative unpacking (struct.Struct.iter_unpack).
diff --git a/Misc/NEWS.d/next/Library/2023-07-29-02-01-24.gh-issue-107406.ze6sQP.rst b/Misc/NEWS.d/next/Library/2023-07-29-02-01-24.gh-issue-107406.ze6sQP.rst
new file mode 100644
index 0000000..b78e57f
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-07-29-02-01-24.gh-issue-107406.ze6sQP.rst
@@ -0,0 +1,2 @@
+Implement new :meth:`__repr__` method for :class:`struct.Struct`.
+Now it returns ``Struct(<format repr>)``.
diff --git a/Modules/_struct.c b/Modules/_struct.c
index 606ae5e..4da6542 100644
--- a/Modules/_struct.c
+++ b/Modules/_struct.c
@@ -2165,6 +2165,19 @@ s_sizeof(PyStructObject *self, void *unused)
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 */
static struct PyMethodDef s_methods[] = {
@@ -2197,6 +2210,7 @@ static PyType_Slot PyStructType_slots[] = {
{Py_tp_dealloc, s_dealloc},
{Py_tp_getattro, PyObject_GenericGetAttr},
{Py_tp_setattro, PyObject_GenericSetAttr},
+ {Py_tp_repr, s_repr},
{Py_tp_doc, (void*)s__doc__},
{Py_tp_traverse, s_traverse},
{Py_tp_clear, s_clear},