Index: Objects/bytesobject.c =================================================================== --- Objects/bytesobject.c (Revision 58857) +++ Objects/bytesobject.c (Arbeitskopie) @@ -923,6 +923,12 @@ } static PyObject * +bytes_str(PyObject *op) +{ + return PyObject_CallMethod(op, "decode", "s", "ascii"); +} + +static PyObject * bytes_richcompare(PyObject *self, PyObject *other, int op) { Py_ssize_t self_size, other_size; @@ -3063,7 +3069,7 @@ &bytes_as_mapping, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ - (reprfunc)bytes_repr, /* tp_str */ + bytes_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ &bytes_as_buffer, /* tp_as_buffer */ Index: Objects/stringobject.c =================================================================== --- Objects/stringobject.c (Revision 58857) +++ Objects/stringobject.c (Arbeitskopie) @@ -679,6 +679,12 @@ return PyString_Repr(op, 1); } +static PyObject * +string_str(PyObject *op) +{ + return PyObject_CallMethod(op, "decode", "s", "ascii"); +} + static Py_ssize_t string_length(PyStringObject *a) { @@ -3090,13 +3096,13 @@ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ - string_repr, /* tp_repr */ + (reprfunc)string_repr, /* tp_repr */ 0, /* tp_as_number */ &string_as_sequence, /* tp_as_sequence */ &string_as_mapping, /* tp_as_mapping */ (hashfunc)string_hash, /* tp_hash */ 0, /* tp_call */ - string_repr, /* tp_str */ + string_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ &string_as_buffer, /* tp_as_buffer */ Index: Lib/test/test_bytes.py =================================================================== --- Lib/test/test_bytes.py (Revision 58857) +++ Lib/test/test_bytes.py (Arbeitskopie) @@ -86,16 +86,23 @@ self.assertRaises(ValueError, buffer, [sys.maxint+1]) self.assertRaises(ValueError, buffer, [10**100]) - def test_repr_str(self): - for f in str, repr: - self.assertEqual(f(buffer()), "buffer(b'')") - self.assertEqual(f(buffer([0])), "buffer(b'\\x00')") - self.assertEqual(f(buffer([0, 1, 254, 255])), - "buffer(b'\\x00\\x01\\xfe\\xff')") - self.assertEqual(f(b"abc"), "b'abc'") - self.assertEqual(f(b"'"), '''b"'"''') - self.assertEqual(f(b"'\""), r"""b'\'"'""") + def test_repr(self): + self.assertEqual(repr(buffer()), "buffer(b'')") + self.assertEqual(repr(buffer([0])), "buffer(b'\\x00')") + self.assertEqual(repr(buffer([0, 1, 254, 255])), + "buffer(b'\\x00\\x01\\xfe\\xff')") + self.assertEqual(repr(b"abc"), "b'abc'") + self.assertEqual(repr(b"'"), '''b"'"''') + self.assertEqual(repr(b"'\""), r"""b'\'"'""") + def test_str(self): + self.assertEqual(str(buffer()), "") + self.assertEqual(str(buffer([0])), "\x00") + self.assertRaises(UnicodeDecodeError, str, buffer([0, 1, 254, 255])) + self.assertEqual(str(b"abc"), "abc") + self.assertEqual(str(b"'"), "'") + self.assertEqual(str(b"'\""), "'\"") + self.assertRaises(UnicodeDecodeError, str, bytes([0, 1, 254, 255])) def test_compare(self): b1 = buffer([1, 2, 3]) @@ -371,9 +378,10 @@ self.assertEqual(b, buffer(sample)) def test_to_str(self): - self.assertEqual(str(b''), "b''") - self.assertEqual(str(b'x'), "b'x'") - self.assertEqual(str(b'\x80'), "b'\\x80'") + self.assertEqual(str(b''), "") + self.assertEqual(str(b'x'), "x") + self.assertEqual(str(b'\x61\x62'), "ab") + self.assertRaises(UnicodeDecodeError, str, b'\xff') def test_from_int(self): b = buffer(0)