En pocas palabras, la forma en que se manejan el texto y los datos en Py3k podría ser el cambio más "definitivo" en el idioma. Al conocer y evitar, cuando sea posible, las situaciones en las que la lógica de Python 2.6 funcionará de forma diferente que en 3.x, podemos facilitar la migración cuando sucede. Sin embargo, debemos esperar que algunas partes de la lógica 2.6 pueden requerir atención y modificaciones especiales, por ejemplo, para hacer frente a las codificaciones distintas etc.
La idea detrás de la sugerencia de BDFL en la diapositiva 14 es, probablemente, para empezar "usando" los mismos tipos que Py3k admite (y solo estos), a saber, cadenas de caracteres unicode para cadenas (tipo str
) y secuencias de bytes de 8 bits para "datos" (tipo bytes
).
El término "usando" en la frase anterior se usa bastante poco porque la semántica y el almacenamiento/codificación asociados para estos tipos difieren entre las versiones 2.6 y 3.x. En Python 2.6, el tipo de bytes y la sintaxis literal asociada (b'xyz ') simplemente se asignan al tipo str. Por lo tanto
# in Py2.6
>>'mykey' == b'mykey'
True
b'mykey'.__class__
<class 'str'>
# in Py3k
>>>'mykey' == b'mykey'
False
b'mykey'.__class__
<class 'bytes'>
Para responder a su pregunta [en los comentarios a continuación], en 2,6 si se utiliza b'xyz' o 'xyz', Python lo entiende como el mismo y una cosa: un str. Lo que es importante es que que entender esto como [potencialmente/en-el-futuro] dos tipos distintos con un propósito distinto:
- str para obtener información de texto similares, y
- bytes para las secuencias de de octetos que almacenan los datos a mano.
Por ejemplo, nuevamente hablando cerca de su ejemplo/pregunta, en Py3k podrá tener un diccionario con dos elementos que tienen teclas similares, una con b'mykey 'y la otra con' mykey ', sin embargo, bajo 2.6 esto no es posible, ya que estas dos claves son realmente iguales; lo que importa es que conozca este tipo de cosas y evite (o marque explícitamente de forma especial en el código) las situaciones en las que el código 2.6 no funcionará en 3.x.
En Py3k, str es una cadena abstracta de Unicode, una secuencia de puntos de código Unicode (caracteres) y Python trata de convertir esto a/desde su forma codificada cualquiera que sea la codificación (como programador puedes opinar sobre la codificación pero en el momento en que se ocupa de las operaciones de cadena y tal no necesita preocuparse por estos detalles). Por el contrario, bytes es una secuencia de "cosas" de 8 bits que la semántica y la codificación se dejan totalmente al programador.
Así, a pesar de que Python 2.6 no ve una diferencia, utilizando explícitamente bytes()/b '...' o str()/u '...', que ...
- ... prepararse y preparar a su programa para los próximos tipos y semántica de Py3k
- ... hacen que sea más fácil para la conversión automática (herramienta 2to3 u otro) del código fuente, por lo que el b en B'. .. 'se mantendrá y el u de u' ... 'se eliminará (ya que el único tipo de cadena será unicode).
Para obtener más información:
Python 2.6 What's new (ver PEP 3112 Bytes literales)
Python 3.0 What's New (ver Text Vs. Data Instead Of Unicode Vs. 8-bit
cerca de la parte superior)
También es una buena práctica para hacer que realmente piensa acerca de si nos referimos a una cadena de caracteres o una cadena de bytes! El único problema es, por supuesto, que pierde compatibilidad con Python 2.5 y versiones anteriores. – bobince
entiendo por qué * * que es una buena idea hacer esto, pero todavía no estoy claro en cuanto a cómo * * exactamente. A menos que una función espere explícitamente una cadena de bytes, ¿cuándo uso una cadena de bytes frente a una cadena de caracteres? my_dict [b'mykey '] o my_dict [u'mykey']? ¿Cuándo se consideran datos, cuándo se considera texto? – cschol
Gracias por la actualización detallada. – cschol