self.check_sizeof('0s', 1)
self.check_sizeof('0c', 0)
+ def test_unicode_format(self):
+ try:
+ unicode
+ except NameError:
+ self.skipTest('no unicode support')
+ # Issue #19099
+ s = struct.Struct(unichr(ord('I')))
+ self.assertEqual(s.format, 'I')
+ self.assertIs(type(s.format), str)
+ self.assertRaises(ValueError, struct.Struct, unichr(0x80))
+
+
def test_main():
support.run_unittest(StructTest)
Library
-------
+- Issue #19099: The struct module now supports Unicode format strings.
+
- Issue #19878: Fix segfault in bz2 module after calling __init__ twice with
non-existent filename. Initial patch by Vajrasky Kok.
assert(PyStruct_Check(self));
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "S:Struct", kwlist,
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:Struct", kwlist,
&o_format))
return -1;
- Py_INCREF(o_format);
- Py_CLEAR(soself->s_format);
- soself->s_format = o_format;
+ if (PyString_Check(o_format)) {
+ Py_INCREF(o_format);
+ Py_CLEAR(soself->s_format);
+ soself->s_format = o_format;
+ }
+ else if (PyUnicode_Check(o_format)) {
+ PyObject *str = PyUnicode_AsEncodedString(o_format, "ascii", NULL);
+ if (str == NULL)
+ return -1;
+ Py_CLEAR(soself->s_format);
+ soself->s_format = str;
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "Struct() argument 1 must be string, not %s",
+ Py_TYPE(o_format)->tp_name);
+ return -1;
+ }
ret = prepare_s(soself);
return ret;