2011-05-05 16 views
28

Según PEP 358, un objeto de bytes se utiliza para almacenar una secuencia mutable de bytes (0-255), levantando si este no es el caso.el tipo bytes en Python 2.7 y PEP-358

Sin embargo, mi pitón 2.7 dice lo contrario

>>> bytes([1,2,3]) 
'[1, 2, 3]' 
>>> bytes([280]) 
'[280]' 
>>> bytes is str 
True 
>>> bytes 
<type 'str'> 

¿Alguien tiene una pista sobre la razón por la que el PEP se declara final, pero la aplicación no se ajusta?

Respuesta

34

El tipo bytes se introdujo en Python 3, pero lo que se está discutiendo en el PEP es una secuencia mutable (bytes es inmutable) que se introdujo en Python 2.6 bajo el nombre bytearray.

El PEP claramente no se implementó como se establece (y sí dice que fue parcialmente reemplazado por PEP 3137) pero creo que es solo una cuestión de que se renombren las cosas, no de que falten características.En Python 2 bytes es solo un alias para str para ayudar a la compatibilidad con versiones anteriores, por lo que es un acertijo.

Ejemplo bytearray uso:

>>> a = bytearray([1,2,3]) 
>>> a[0] = 5 
>>> a 
bytearray(b'\x05\x02\x03') 
+1

3137 por lo que veo es para Python 3, el mismo tema, pero aún no lo he leído. –

+0

bytearray fue una de las nuevas características 3.0 que se back-ported para 2.6 si no recuerdo mal. –

+0

@StefanoBorini Deberías haber buscado comer debajo de la respuesta. – overexchange

3

bytes objetos sólo existen realmente en Python 3.x bytes es un alias para str en Python 2.7. Existe para ayudar a escribir código portable entre Python 2 y 3.

44

El nuevo tipo bytes es 3.x. El 2.x bytes incorporado es solo un alias para el tipo str. No hay un tipo nuevo llamado bytes en 2.x; Solo una nueva alias y sintaxis literal para str.

Aquí está la documentation snippet todo el mundo ama:

Python 2.6 añade bytes como sinónimo de el tipo str, y también es compatible con la notación b''.

El 2,6 str difiere del de 3.0 bytes Tipo de diversas maneras; más notablemente, el constructor es completamente diferente . En 3,0, bytes([65, 66, 67]) es de 3 elementos de largo, que contiene los bytes que representan ABC; en 2.6, bytes([65, 66, 67]) devuelve la cadena 12 bytes, que representa la str() de la lista.

El uso principal de bytes en 2.6 se ser escribir pruebas de tipo de objeto, tales como isinstance(x, bytes). Esto hará que ayude al convertidor 2to3, que no puede indicar si el código 2.x tiene la intención de que las cadenas contengan caracteres u 8 bytes; Ahora puede usar bytes o str para representar su intención exactamente, y el código resultante será también correcto en Python 3.0.

+1

buena respuesta, y de hecho explica los efectos, pero no explicó la falta de adherencia al PEP, por lo tanto, he marcado Scott como correcta, y que upvote. –

+0

python 3.x tiene bytes como un nuevo tipo mientras que en python2.x bytes es el tipo str en sí mismo ... bien resaltado. – igaurav