[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