[Python-3000-checkins] r53892 - in python/branches/p3yk: Include/Python-ast.h Lib/test/test_bytes.py Objects/bytesobject.c Python/symtable.c
Guido van Rossum
guido at python.org
Sun Feb 25 05:55:07 CET 2007
I don't understand this. repr() isn't meant to let you tell individual
objects apart, just disambiguate the type. repr(1) should !=
repr("1"). But repr([]) == repr([]) even if the two lists are not the
same object.
--Guido
On 2/24/07, Brett Cannon <brett at python.org> wrote:
> Is this the type of repr we want for a mutable object? I know Guido
> has said he like repr representations to make it possible to tell
> inidividual objects apart and that the __str__ representation can mask
> that to make it easier to read.
>
> With the object being mutable it would be very easy to have two
> objects that look the same under repr.
>
> -Brett
>
> On 2/24/07, georg.brandl <python-3000-checkins at python.org> wrote:
> > Author: georg.brandl
> > Date: Sat Feb 24 20:41:35 2007
> > New Revision: 53892
> >
> > Modified:
> > python/branches/p3yk/Include/Python-ast.h
> > python/branches/p3yk/Lib/test/test_bytes.py
> > python/branches/p3yk/Objects/bytesobject.c
> > python/branches/p3yk/Python/symtable.c
> > Log:
> > Make bytes_repr return a string containing a b"" literal.
> >
> >
> >
> > Modified: python/branches/p3yk/Include/Python-ast.h
> > ==============================================================================
> > --- python/branches/p3yk/Include/Python-ast.h (original)
> > +++ python/branches/p3yk/Include/Python-ast.h Sat Feb 24 20:41:35 2007
> > @@ -516,4 +516,3 @@
> > alias_ty _Py_alias(identifier name, identifier asname, PyArena *arena);
> >
> > PyObject* PyAST_mod2obj(mod_ty t);
> > -
> >
> > Modified: python/branches/p3yk/Lib/test/test_bytes.py
> > ==============================================================================
> > --- python/branches/p3yk/Lib/test/test_bytes.py (original)
> > +++ python/branches/p3yk/Lib/test/test_bytes.py Sat Feb 24 20:41:35 2007
> > @@ -69,9 +69,11 @@
> > self.assertRaises(ValueError, bytes, [10**100])
> >
> > def test_repr(self):
> > - self.assertEqual(repr(bytes()), "bytes()")
> > - self.assertEqual(repr(bytes([0])), "bytes([0x00])")
> > - self.assertEqual(repr(bytes([0, 1, 254, 255])), "bytes([0x00, 0x01, 0xfe, 0xff])")
> > + self.assertEqual(repr(bytes()), "b''")
> > + self.assertEqual(repr(bytes([0])), "b'\\0'")
> > + self.assertEqual(repr(bytes([0, 1, 254, 255])), "b'\\0\\x01\\xfe\\xff'")
> > + self.assertEqual(repr(bytes('abc')), "b'abc'")
> > + self.assertEqual(repr(bytes("'")), "b'\\''")
> >
> > def test_compare(self):
> > b1 = bytes([1, 2, 3])
> >
> > Modified: python/branches/p3yk/Objects/bytesobject.c
> > ==============================================================================
> > --- python/branches/p3yk/Objects/bytesobject.c (original)
> > +++ python/branches/p3yk/Objects/bytesobject.c Sat Feb 24 20:41:35 2007
> > @@ -733,65 +733,63 @@
> > return -1;
> > }
> >
> > +/* Mostly copied from string_repr, but without the
> > + "smart quote" functionality. */
> > static PyObject *
> > bytes_repr(PyBytesObject *self)
> > {
> > - PyObject *list;
> > - PyObject *str;
> > - PyObject *result;
> > - int err;
> > - int i;
> > -
> > - if (self->ob_size == 0)
> > - return PyString_FromString("bytes()");
> > -
> > - list = PyList_New(0);
> > - if (list == NULL)
> > + size_t newsize = 3 + 4 * self->ob_size;
> > + PyObject *v;
> > + if (newsize > PY_SSIZE_T_MAX || newsize / 4 != self->ob_size) {
> > + PyErr_SetString(PyExc_OverflowError,
> > + "bytes object is too large to make repr");
> > return NULL;
> > -
> > - str = PyString_FromString("bytes([");
> > - if (str == NULL)
> > - goto error;
> > -
> > - err = PyList_Append(list, str);
> > - Py_DECREF(str);
> > - if (err < 0)
> > - goto error;
> > -
> > - for (i = 0; i < self->ob_size; i++) {
> > - char buffer[20];
> > - sprintf(buffer, ", 0x%02x", (unsigned char) (self->ob_bytes[i]));
> > - str = PyString_FromString((i == 0) ? buffer+2 : buffer);
> > - if (str == NULL)
> > - goto error;
> > - err = PyList_Append(list, str);
> > - Py_DECREF(str);
> > - if (err < 0)
> > - goto error;
> > }
> > -
> > - str = PyString_FromString("])");
> > - if (str == NULL)
> > - goto error;
> > -
> > - err = PyList_Append(list, str);
> > - Py_DECREF(str);
> > - if (err < 0)
> > - goto error;
> > -
> > - str = PyString_FromString("");
> > - if (str == NULL)
> > - goto error;
> > -
> > - result = _PyString_Join(str, list);
> > - Py_DECREF(str);
> > - Py_DECREF(list);
> > - return result;
> > -
> > - error:
> > - /* Error handling when list != NULL */
> > - Py_DECREF(list);
> > - return NULL;
> > + v = PyString_FromStringAndSize((char *)NULL, newsize);
> > + if (v == NULL) {
> > + return NULL;
> > + }
> > + else {
> > + register Py_ssize_t i;
> > + register char c;
> > + register char *p;
> > + int quote = '\'';
> > +
> > + p = PyString_AS_STRING(v);
> > + *p++ = 'b';
> > + *p++ = quote;
> > + for (i = 0; i < self->ob_size; i++) {
> > + /* There's at least enough room for a hex escape
> > + and a closing quote. */
> > + assert(newsize - (p - PyString_AS_STRING(v)) >= 5);
> > + c = self->ob_bytes[i];
> > + if (c == quote || c == '\\')
> > + *p++ = '\\', *p++ = c;
> > + else if (c == '\t')
> > + *p++ = '\\', *p++ = 't';
> > + else if (c == '\n')
> > + *p++ = '\\', *p++ = 'n';
> > + else if (c == '\r')
> > + *p++ = '\\', *p++ = 'r';
> > + else if (c == 0)
> > + *p++ = '\\', *p++ = '0';
> > + else if (c < ' ' || c >= 0x7f) {
> > + /* For performance, we don't want to call
> > + PyOS_snprintf here (extra layers of
> > + function call). */
> > + sprintf(p, "\\x%02x", c & 0xff);
> > + p += 4;
> > + }
> > + else
> > + *p++ = c;
> > + }
> > + assert(newsize - (p - PyString_AS_STRING(v)) >= 1);
> > + *p++ = quote;
> > + *p = '\0';
> > + _PyString_Resize(
> > + &v, (p - PyString_AS_STRING(v)));
> > + return v;
> > + }
> > }
> >
> > static PyObject *
> >
> > Modified: python/branches/p3yk/Python/symtable.c
> > ==============================================================================
> > --- python/branches/p3yk/Python/symtable.c (original)
> > +++ python/branches/p3yk/Python/symtable.c Sat Feb 24 20:41:35 2007
> > @@ -1177,7 +1177,8 @@
> > break;
> > case Num_kind:
> > case Str_kind:
> > - case Ellipsis_kind:
> > + case Bytes_kind:
> > + case Ellipsis_kind:
> > /* Nothing to do here. */
> > break;
> > /* The following exprs can be assignment targets. */
> > _______________________________________________
> > Python-3000-checkins mailing list
> > Python-3000-checkins at python.org
> > http://mail.python.org/mailman/listinfo/python-3000-checkins
> >
> _______________________________________________
> Python-3000-checkins mailing list
> Python-3000-checkins at python.org
> http://mail.python.org/mailman/listinfo/python-3000-checkins
>
--
--Guido van Rossum (home page: http://www.python.org/~guido/)
More information about the Python-3000-checkins
mailing list