The format string used to construct this Struct object.
+ .. versionchanged:: 3.7
+ The format string type is now :class:`str` instead of :class:`bytes`.
+
.. attribute:: size
The calculated size of the struct (and hence of the bytes object produced
``makedirs()``.
(Contributed by Serhiy Storchaka in :issue:`19930`.)
+* The :attr:`struct.Struct.format` type is now :class:`str` instead of
+ :class:`bytes`. (Contributed by Victor Stinner in :issue:`21071`.)
+
CPython bytecode changes
------------------------
# Shouldn't crash.
self.assertEqual(struct.unpack(b'b', b'a'), (b'a'[0],))
+ def test_format_attr(self):
+ s = struct.Struct('=i2H')
+ self.assertEqual(s.format, '=i2H')
+
+ # use a bytes string
+ s2 = struct.Struct(s.format.encode())
+ self.assertEqual(s2.format, s.format)
+
class UnpackIteratorTest(unittest.TestCase):
"""
Library
-------
+- bpo-21071: struct.Struct.format type is now :class:`str` instead of
+ :class:`bytes`.
+
- bpo-29212: Fix concurrent.futures.thread.ThreadPoolExecutor threads to have
a non repr() based thread name by default when no thread_name_prefix is
supplied. They will now identify themselves as "ThreadPoolExecutor-y_n".
static PyObject *
s_get_format(PyStructObject *self, void *unused)
{
- Py_INCREF(self->s_format);
- return self->s_format;
+ return PyUnicode_FromStringAndSize(PyBytes_AS_STRING(self->s_format),
+ PyBytes_GET_SIZE(self->s_format));
}
static PyObject *