Qué hay de nuevo en Python 3.3

Éste artículo explica las nuevas características en python 3.3, en comparación con la versión 3.2. Python 3.3 se lanzó el 29 de septiembre de 2012. Para más detalles, ver el log de cambios en la dirección <https://docs.python.org/3.3/whatsnew/changelog.html>.

Ver también

PEP 398 - Calendario de Publicación Python 3.3

Resumen – Aspectos destacados de la versión

Nuevas características de sintaxis:

Nuevos módulos de biblioteca:

  • faulthandler (ayuda a depurar bloqueos de bajo nivel)

  • ipaddress (Objetos de alto nivel que representan direcciones IP y máscaras)

  • lzma (comprime datos usando el algoritmo XZ / LZMA)

  • unittest.mock (Utiliza objetos que simulen partes de tu sistema en ambiente de pruebas)

  • venv (Python entornos virtuales, como en el paquete original Virtualenv)

Nuevas características incorporadas:

Mejoras de implementación:

Módulos de biblioteca con mejoras significativas:

Mejoras de seguridad:

  • La aleatoriedad en los hash está habilitada de forma predeterminada.

Por favor continúa leyendo para obtener una lista completa de los cambios de cara al usuario.

PEP 405: Entornos virtuales

Los entornos virtuales ayudan a crear configuraciones separadas de Python mientras comparten una instalación base en todo el sistema, para facilitar el mantenimiento. Los entornos virtuales tienen su propio conjunto de paquetes de sitios privados (es decir, bibliotecas instaladas localmente) y están opcionalmente segregados de los paquetes de sitios de todo el sistema. Su concepto e implementación están inspirados en el popular paquete de terceros virtualenv, pero se benefician de una integración más estrecha con el núcleo del intérprete.

Este PEP agrega el módulo venv para acceso programático, y el script pyvenv para administración y acceso a través de línea de comandos. El intérprete de python busca un archivo llamado pyvenv.cfg, cuya existencia señala la base de un árbol de directorios en el entorno virtual.

Ver también

PEP 405 - Entornos virtuales en python

PEP escrito por Carl Meyer; implementación por Carl Meyer y Vinay Sajip

PEP 420: Paquetes para espacios de nombres implícitos

Soporte nativo para directorios de paquetes que no requieran el archivo __init.py__ y puedan abarcar automáticamente múltiples segmentos de rutas de acceso (Inspirado en varios enfoques de terceros para espacios de nombres de paquetes, tal como está especificado en PEP 420)

Ver también

PEP 420 - Paquetes de espacio de nombres implícitos

PEP escrito por Eric V. Smith; implementación por Eric V. Smith y Barry Warsaw

PEP 3118: Nueva implementación de vista de memoria y en la documentación del protocolo del buffer

La implementación del PEP 3118 ha tenido mejoras significativas.

La nueva implementación de la vista de memoria corrige exhaustivamente todos los problemas de propiedad y duración de los campos asignados dinámicamente en la estructura de Py_buffer que ha dado lugar a varios informes de bloqueo. Además, se han corregido varias funciones que se bloquearon o retornaron resultados incorrectos para entradas no contigua o multidimensional.

El objeto de vista de memoria dispone ahora de PEP-3118 que obedece a getbufferproc(), el cual verifica el tipo de petición del cliente. Se han agregado nuevas características, la mayoría de ellas funcionan generalmente para arrays no contiguos y arrays con subindices.

La documentación se ha actualizado y se han establecido claramente las responsabilidades tanto para los exportadores como para los consumidores. Los indicadores de solicitud de buffer se agrupan en indicadores básicos y compuestos. Se explica el diseño de memoria de matrices de estilo NumPy no contiguas y multidimensionales.

Características

  • Ahora se admiten todos los especificadores nativos de formato de un solo carácter en la sintaxis del módulo de estructura (opcionalmente con el prefijo “@”).

  • Con algunas reestricciones, el método cast() permite cambiar el formato y forma de los arrays contiguos.

  • La representación de listas multidimensionales es aceptada por cualquier tipo de array.

  • Se admiten comparaciones multidimensionales para cualquier tipo de array.

  • Los objetos de vista de memoria unidimensionales de tipo hash con formatos B, b, o c ahora son hashables (Contribución por Antoine Pitrou en el issue 13411.)

  • Arbitrary slicing of any 1-D arrays type is supported. For example, it is now possible to reverse a memoryview in O(1) by using a negative step.

Cambios en la API

  • Oficialmente, se limita el número máximo de dimensiones a 64.

  • Las formas vacías, pasos, y subíndices ahora son representados por una tupla vacía, en vez de None.

  • El acceso al elemento de una vista de memoria con formato “B” (bytes sin signo) ahora retorna un entero (de acuerdo con la sintaxis del módulo de estructura). Para retornar un objeto bytes, primero la vista debe ser convertida a «C».

  • las comparaciones de la vista de memoria ahora utilizan la estructura lógica de los operandos y comparan todos los elementos de array por valor. Se admiten todos los formatos strings en la sintaxis del módulo de estructura. Aún se admiten las vistas con strings que tengan un formato no reconocido, pero siempre se compararan como desiguales, independientemente del contenido de la vista.

  • Para más cambios, consulte Compilación y cambios en la API de C y Portabilidad del código C.

(Contribución por Stefan Krah en el issue 10181 .)

Ver también

PEP 3118 - Revisando el protocolo de buffer

PEP 393: Representación flexible de cadenas de caracteres

El tipo de cadena Unicode es modificado para admitir múltiples representaciones internas, dependiendo del caracter con el ordinal Unicode más grande (1, 2 o 4 bytes) en la cadena representada. Esto permite una representación que ahorra espacio en casos comunes, pero da acceso a UCS-4 completo en todos los sistemas. Para compatibilidad con APIS existentes, pueden existir varias representaciones en paralelo; con el tiempo, esta compatibilidad debería eliminarse gradualmente.

Por parte de Python, no debería haber inconvenientes por éste cambio.

Por parte de la API de C, PEP 393 es totalmente compatible con versiones anteriores. La API antigua debería quedar disponible al menos por cinco años. Las aplicaciones que usan la API antigua no saldrán beneficiadas por la reducción de memoria, o -peor- podrían usar un bit más de memoria, debido a que python necesitaría mantener dos versiones de cada cadena de caracteres (en el formato antiguo y en el nuevo almacenamiento)

Funcionalidad

Los cambios introducidos en el PEP 393 son los siguientes:

  • Ahora python admite siempre el rango completo de códigos Unicode, incluyendo los que no son BMP (es decir, U+0000 to U+10FFFF). La distinción entre ancho y angosto ya no existe, y python se comporta ahora como una compilación amplia, incluso en sistemas windows.

  • Con la eliminación de las construcciones estrechas, han sido solucionados también los problemas específicos referentes a este tipo de construcciones, por ejemplo:

    • len() Ahora siempre retorna 1 para los caracteres que no son BMP, de modo que len('\U0010FFFF') == 1;

    • los pares sustitutos no se recombinan en cadenas literales, de modo que '\uDBFF\uDFFF' != '\U0010FFFF';

    • la indexación o el corte de caracteres que no son BMP, retorna el valor esperado, de modo que '\U0010FFFF'[0] ahora retorna '\U0010FFFF' y no '\uDBFF';

    • todas las demás funciones en la librería estándar ahora gestionan de forma correcta los puntos de código que no son BMP.

  • El valor de sys.maxunicode ahora es siempre 1114111 (0x10FFFF en hexadecimal). La función PyUnicode_GetMax() aún devuelve 0xFFFF o 0x10FFFF por compatibilidad con versiones anteriores y no debe usarse con la nueva API Unicode (consulte bpo-13054).

  • Se ha eliminado el indicador ./configure --with-wide-unicode.

Rendimiento y uso de recursos

El almacenamiento de las cadenas Unicode ahora depende del punto de código más alto en la cadena:

  • las cadenas de caracteres en ASCII puro y Latin1 (U+0000-U+00FF) usan 1 byte por punto de código;

  • Las cadenas de caracteres BMP (U+0000-U+FFFF) usan 2 bytes por punto de código;

  • las cadenas de caracteres que no son BMP (U+10000-U+10FFFF) usan 4 bytes por punto de código.

El efecto neto es que para la mayoría de las aplicaciones, el uso de memoria del almacenamiento de cadenas de caracteres debería disminuir significativamente, especialmente en comparación con las construcciones unicode anchas, ya que, en muchos casos, las cadenas serán ASCII puro incluso en contextos internacionales (porque muchas cadenas almacenan datos en lenguaje no humano, tal como fragmentos XML, encabezados HTTP, datos codificados en JSON, etc.). También esperamos que, por las mismas razones, aumente la eficiencia de la caché de la CPU en aplicaciones no triviales. El uso de memoria de Python 3.3 es dos o tres veces más pequeño que Python 3.2, y un poco mejor que Python 2.7, en un punto de referencia de Django (consulte el PEP para obtener más detalles).

Ver también

PEP 393 - Representación flexible de cadenas de caracteres

PEP escrito por Martin von Lowis; implementado por Torsten Becker y Martin von Lowis.

PEP 397: Lanzador de python para windows

El instalador de Python 3.3 para windows ahora incluye una aplicación lanzadora py que puede ser utilizada para ejecutar aplicaciones python de forma independiente de la versión.

Este lanzador se invoca de forma implícita cuando haces doble click en archivos *.py. Si el sistema tiene instalada una única versión de python, ésta versión será usada para ejecutar el archivo. Si hay múltiples versiones instaladas en el sistema, se utilizara por defecto la versión más reciente pero ésto puede ser anulado incluyendo una «línea shebang» estilo Unix en el script de Python.

El lanzador también se puede usar explícitamente desde la línea de comando como la aplicación py. La ejecución de py sigue las mismas reglas de selección de versión que la ejecución implícita de scripts, pero se puede seleccionar una versión más específica pasando los argumentos apropiados (como -3 para solicitar Python 3 cuando Python 2 también está instalado, o -2.6 para solicitar específicamente una versión anterior de Python cuando se instala una versión más reciente).

Además del lanzador, el instalador de Windows ahora incluye una opción para agregar el Python recién instalado al PATH del sistema. (Contribución de Brian Curtin en bpo-3561.)

Ver también

PEP 397 - Python Launcher for Windows

PEP escrito por Mark Hammond y Martin v. Löwis; implementado por Vinay Sajip.

Documentación del lanzador: Lanzador de Python para Windows

Modificación de la ruta del instalador: Encontrar el ejecutable de Python

PEP 3151: Reelaborando de la jerarquía de excepciones de IO y OS

La jerarquía de excepciones generada por errores del sistema operativo ahora está simplificada y es más detallada.

No tienes que preocuparte más por cómo elegir el tipo de excepción adecuado entre OSError, IOError, EnvironmentError, WindowsError, mmap.error, socket.error or select.error. Todos estos tipos de excepción son ahora una sola: OSError. Los otros nombres se mantienen como alias por razones de compatibilidad.

Además, ahora es más fácil detectar una condición de error específica. En lugar de inspeccionar el atributo errno (o args[0]) para una constante particular del módulo errno, puede seleccionar la subclase OSError adecuada. Las subclases disponibles son las siguientes:

Y el mismo ConnectionError tiene subclases más detalladas:

Gracias a las nuevas excepciones, los usos comunes de errno ahora se pueden evitar. Por ejemplo, el siguiente código escrito para Python 3.2:

from errno import ENOENT, EACCES, EPERM

try:
    with open("document.txt") as f:
        content = f.read()
except IOError as err:
    if err.errno == ENOENT:
        print("document.txt file is missing")
    elif err.errno in (EACCES, EPERM):
        print("You are not allowed to read document.txt")
    else:
        raise

ahora se pueden escribir sin la importación de errno y sin la inspección manual de atributos de excepción:

try:
    with open("document.txt") as f:
        content = f.read()
except FileNotFoundError:
    print("document.txt file is missing")
except PermissionError:
    print("You are not allowed to read document.txt")

Ver también

PEP 3151 - Re elaboración de la jerarquía de excepciones de IO y OS

PEP escrito e implementado por Antoine Pitrou

PEP 380: Sintaxis para delegar en un subgenerador

PEP 380 agrega la expresión yield from, permitiendo que un generator delegue parte de sus operaciones a otro generador. Esto permite tomar en consideración una sección de código que contenga la palabra yield y ubicarla en otro generador. Además, el subgenerador puede regresar con un valor y el valor se pone a disposición del generador que delega.

Aunque está diseñada principalmente para su uso en la delegación a un subgenerador, la expresión yield from en realidad permite la delegación a subiteradores arbitrarios.

Para iteradores simples, yield from iterable es esencialmente una forma abreviada de for item in iterable: yield item:

>>> def g(x):
...     yield from range(x, 0, -1)
...     yield from range(x)
...
>>> list(g(5))
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4]

Sin embargo, a diferencia de un ciclo ordinario, yield from permite que los subgeneradores reciban valores enviados y lanzados directamente desde el ámbito de la llamada y retornen un valor final al generador externo:

>>> def accumulate():
...     tally = 0
...     while 1:
...         next = yield
...         if next is None:
...             return tally
...         tally += next
...
>>> def gather_tallies(tallies):
...     while 1:
...         tally = yield from accumulate()
...         tallies.append(tally)
...
>>> tallies = []
>>> acc = gather_tallies(tallies)
>>> next(acc)  # Ensure the accumulator is ready to accept values
>>> for i in range(4):
...     acc.send(i)
...
>>> acc.send(None)  # Finish the first tally
>>> for i in range(5):
...     acc.send(i)
...
>>> acc.send(None)  # Finish the second tally
>>> tallies
[6, 10]

Lo más importante de éste cambio es permitir que incluso los generadores que están diseñados para ser usados con los métodos send y throw sean separados en múltiples subgeneradores tan fácilmente como las funciones grandes se pueden dividir en varias subfunciones.

Ver también

PEP 380 - Sintaxis para delegar a un subgenerador

PEP escrito por Greg Ewing; implementación por Greg Ewing, integrado en 3.3 por Renaud Blanch, Ryan Kelly y Nick Coghlan; documentación de Zbigniew Jędrzejewski-Szmek y Nick Coghlan

PEP 409: Suprimir el contexto de excepción

PEP 409 introduce una nueva sintaxis que permite deshabilitar la visualización del contexto de excepción encadenado. Esto permite mensajes de error más limpios en aplicaciones que convierten entre tipos de excepción:

>>> class D:
...     def __init__(self, extra):
...         self._extra_attributes = extra
...     def __getattr__(self, attr):
...         try:
...             return self._extra_attributes[attr]
...         except KeyError:
...             raise AttributeError(attr) from None
...
>>> D({}).x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in __getattr__
AttributeError: x

Sin el sufijo from None para suprimir la causa, la excepción original se mostraría de forma predeterminada:

>>> class C:
...     def __init__(self, extra):
...         self._extra_attributes = extra
...     def __getattr__(self, attr):
...         try:
...             return self._extra_attributes[attr]
...         except KeyError:
...             raise AttributeError(attr)
...
>>> C({}).x
Traceback (most recent call last):
  File "<stdin>", line 6, in __getattr__
KeyError: 'x'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in __getattr__
AttributeError: x

No se pierde ninguna capacidad de depuración, ya que el contexto de la excepción original permanece disponible en caso de ser necesario (por ejemplo, si una biblioteca suprime detalles importantes y valiosos de forma incorrecta)

>>> try:
...     D({}).x
... except AttributeError as exc:
...     print(repr(exc.__context__))
...
KeyError('x',)

Ver también

PEP 409 - Supresión del contexto de excepción

PEP escrito por Ethan Furman; implementado por Ethan Furman y Nick Coghlan.

PEP 414: Literales Unicode explícitos

Para facilitar la transición de Python 2 para las aplicaciones de Python que reconocen Unicode y que hacen un uso intensivo de literales Unicode, Python 3.3 una vez más admite el prefijo «u» para cadenas literales. Este prefijo no tiene importancia semántica en Python 3, se proporciona únicamente para reducir el número de cambios puramente mecánicos en la migración a Python 3, lo que facilita a los desarrolladores centrarse en los cambios semánticos más significativos (como la separación predeterminada más estricta de binary y datos de texto).

Ver también

PEP 414 - Literales Unicode Explícitos

PEP escrito por Armin Ronacher.

PEP 3155: Nombres calificados para clases y funciones

Functions and class objects have a new __qualname__ attribute representing the «path» from the module top-level to their definition. For global functions and classes, this is the same as __name__. For other functions and classes, it provides better information about where they were actually defined, and how they might be accessible from the global scope.

Ejemplo con métodos (no vinculados):

>>> class C:
...     def meth(self):
...         pass
...
>>> C.meth.__name__
'meth'
>>> C.meth.__qualname__
'C.meth'

Ejemplo con clases anidadas:

>>> class C:
...     class D:
...         def meth(self):
...             pass
...
>>> C.D.__name__
'D'
>>> C.D.__qualname__
'C.D'
>>> C.D.meth.__name__
'meth'
>>> C.D.meth.__qualname__
'C.D.meth'

Ejemplo con funciones anidadas:

>>> def outer():
...     def inner():
...         pass
...     return inner
...
>>> outer().__name__
'inner'
>>> outer().__qualname__
'outer.<locals>.inner'

La representación en cadena de estos objetos, también se ha modificado para incluir la información nueva y más precisa:

>>> str(C.D)
"<class '__main__.C.D'>"
>>> str(C.D.meth)
'<function C.D.meth at 0x7f46b9fe31e0>'

Ver también

PEP 3155 - Nombres calificados para clases y funciones

PEP Escrito e implementado por Antoine Pitrou.

PEP 412: Diccionario de intercambio de claves

Los diccionarios usados para almacenar atributos de objetos, ahora pueden compartir parte de su almacenamiento interno entre sí (a saber, la parte que almacena las claves y sus respectivos hashes). Esto reduce el consumo de memoria de programas creando varias instancias de tipos no integrados.

Ver también

PEP 412 -Diccionario de intercambio de claves

PEP escrito e implementado por Mark Shannon.

PEP 362: Objeto de firma de función

Una nueva función inspect.signature() hace que la introspección de las llamadas de Python sea fácil y directa. Se admite una amplia gama de invocables: funciones python, decoradas o no, clases y objetos functools.partial(). Las Nuevas clases inspect.Signature, inspect.Parameter y inspect.BoundArguments contienen información sobre las firmas de llamadas, tales como anotaciones, valores por defecto, tipos de parámetros, y los argumentos vinculados, lo cual simplifica considerablemente la escritura de decoradores y de cualquier código que valide o modifique las firmas de llamadas o argumentos.

Ver también

PEP 362: - Objeto de firmas de función

PEP escrito por Brett Cannon, Yury Selivanov, Larry Hastings, Jiwon Seo; implementado por Yury Selivanov.

PEP 421: Agregar sys.implementation

Un nuevo atributo en el módulo sys expone detalles específicos de la implementación del intérprete que se ésta ejecutando en el momento actual. El conjunto inicial de atributos en sys.implementation son name, version, hexversion, y cache_tag.

La intención de sys.implementation es consolidar dentro de un espacio de nombres, la implementación específica de datos usado por la biblioteca estándar. Esto permite que diferentes implementaciones de python puedan compartir código de la biblioteca estándar de manera más fácil. En su estado inicial, sys.implementation contiene solo una pequeña porción de los datos específicos de la implementación. Con el tiempo esta proporción cambiará para hacer que la biblioteca estándar sea más portable..

Un ejemplo de mejor portabilidad de la biblioteca estándar es cache_tag. A partir de Python 3.3, sys.implementation.cache_tag es utilizado por importlib para admitir el cumplimiento PEP 3147. Cualquier implementación de Python que utilice importlib para su sistema de importación integrado puede usar cache_tag para controlar el comportamiento de almacenamiento en caché de los módulos.

SimpleNamespace

La implementación de sys.implementation también trae un nuevo tipo a Python: La clase types.SimpleNamespace. En comparación con un nombre de espacio basado en mapas, como dict, SimpleNamespace es basado en atributos, como object. Sin embargo a diferencia de object, las instancias de SimpleNamespace son editables. Esto significa que puedes agregar, eliminar, y modificar el nombre de espacio a través del acceso normal a los atributos.

Ver también

PEP 421 - Agregar sys.implementation

PEP escrito e implementado por Mark Shannon.

Usar importlib como implementación de Import

bpo-2377- Replace__import__w/ importlib.__import__ bpo-13959 - Re-implementar partes de imp en Python puro bpo-14605 - Hacer que la maquinaria de importación sea explícita bpo-14646 - Requerir que los cargadores establezcan __loader__ y __package__

La función __import__() ahora es potenciada por la función importlib.__import__(). Este trabajo conduce a completar la «fase 2» de PEP 302. Hay múltiples beneficios en éste cambio. En primer lugar, ha permitido que la mayoría de la maquinaria que potencia las importaciones sea expuesta, en vez de estar implícitas y ocultas en el código de C. También proporciona una única implementación para todas las máquinas virtuales de python que admitan el uso de Python 3.3 lo que ayuda a terminar con cualquier desviación específica de VM en la semántica de importación. Y finalmente facilita el mantenimiento de la importación, permitiendo que ocurra un crecimiento futuro.

Para el usuario común, no debería haber cambios visibles en la semántica. Para aquellos cuyo código realmente manipula la importación o las llamadas de importación de forma programática, los cambios de código que posiblemente sean necesarios, se tratan en la sección Porting Python code de éste documento.

Nuevas APIs

Uno de los grandes beneficios de éste trabajo es la exposición de lo que implica hacer que funcione la sentencia de importación. Esto significa que los varios importadores que una vez fueron implícitos, ahora son expuestos completamente como parte del paquete importlib.

Las clases base abstractas definidas en importlib.abc se han expandido para delimitar adecuadamente entre buscadores de rutas meta y buscadores de entrada de rutas al introducir la clase importlib.abc.MetaPathFinder y importlib.abc.PathEntryFinder respectivamente. El antiguo ABC de la clase importlib.abc.Finder ahora solo se proporciona para compatibilidad con versiones anteriores y no exige ningún requisito de método.

En términos de buscadores, importlib.machinery.FileFinder expone el mecanismo utilizado para buscar archivos fuente y de código de bytes de un módulo. Anteriormente, ésta clase era un miembro implícito de sys.path_hooks.

Para los cargadores, la nueva clase base abstracta importlib.abc.FileLoader ayuda a escribir un cargador que usa el sistema de archivos como mecanismo de almacenamiento para el código de un módulo. El cargador de archivos fuente (importlib.machinery.SourceFileLoader), archivos de código byte sin fuente (importlib.machinery.SourcelessFileLoader) y módulos de extensión (importlib.machinery.ExtensionFileLoader) ahora están disponibles para su uso directo.

ImportError ahora tiene los atributos name y path que se establecen cuando hay datos relevantes para proporcionar. También, el mensaje de importaciones fallidas ahora proporcionará el nombre completo del módulo en lugar de solo el final del nombre del mismo.

La función importlib.invalidate_caches() ahora llamará al método con el mismo nombre en todos los buscadores almacenados en sys.path_importer_cache para ayudar a limpiar cualquier estado almacenado según sea necesario.

Cambios visibles

Para conocer los posibles cambios necesarios en el código, consulte la sección Porting Python code .

Más allá de la extensión de lo que ahora expone importlib, hay otros cambios visibles para importar. El más grande es que sys.meta_path y sys.path_hooks ahora almacenan todos los buscadores de rutas meta y los ganchos de entrada de rutas usados por la importación. Anteriormente, los buscadores estaban implícitos y ocultos dentro del código C de importación en lugar de estar expuestos directamente. Esto significa que ahora uno puede eliminar o cambiar fácilmente el orden de los diversos buscadores para satisfacer sus necesidades.

Otro cambio es que todos los módulos tienen un atributo __loader__ que almacena el cargador usado para crear el módulo. La PEP 302 se ha actualizado para hacer que este atributo sea obligatorio para implementar los cargadores, de manera que en el futuro, una vez que los cargadores de terceros hayan sido actualizados, las personas puedan confiar en la existencia de éste atributo. Sin embargo, hasta entonces la importación está configurando la post carga del módulo.

También se espera que ahora los cargadores establezcan el atributo __package__ de PEP 366. Una vez más, la importación por sí misma ya está configurando ésto en todos los cargadores del módulo importlib y la importación misma está configurando la post carga del atributo.

Ahora se incluye el atributo None dentro de sys.path_importer_cache cuando no se encuentre ningún buscador en sys.path_hooks. Dado que imp.NullImporter no está directamente expuesto en sys.path_hooks, podría no haber una certeza de que esté disponible para su uso como un valor que represente que no se ha encontrado ningún buscador.

Todos los demás cambios se relacionan con los cambios de semántica que deben tomarse en cuenta al actualizar el código a python 3.3, por lo tanto, deben leerse en la sección Portar código Python de este documento.

(Implementación por Brett Cannon)

Otros cambios de idioma

Algunos cambios más pequeños realizados en el lenguaje Python principal son:

  • Added support for Unicode name aliases and named sequences. Both unicodedata.lookup() and '\N{...}' now resolve name aliases, and unicodedata.lookup() resolves named sequences too.

    (Contribución de Ezio Melotti en bpo-12753.)

  • Base de datos Unicode actualizada a la versión 6.1.0 de UCD

  • Las comparaciones de igualdad en los objetos range() ahora retornan un resultado que refleja la igualdad de las secuencias subyacentes generadas por esos objetos de rango. (bpo-13201)

  • Los métodos count(), find(), rfind(), index() y rindex() de los objetos bytes y bytearray ahora aceptan un entero entre 0 y 255 como su primer argumento.

    (Contribución por Petri Lehtinen en bpo-12170.)

  • Los métodos rjust(), ljust(), y center() de bytes y bytearray ahora aceptan un bytearray para el argumento fill. (Contribución de Petri Lehtinen en bpo-12380.)

  • Se han agregado nuevos métodos a list y bytearray: copy() y clear() (bpo-10516). En consecuencia, MutableSequence ahora también definen un método clear() (bpo-11388).

  • Los literales de bytes sin formato ahora se pueden escribir rb"..." así como br"...".

    (Contribución de Antoine Pitrou en bpo-13748.)

  • El método dict.setdefault() ahora solo hace una sola búsqueda de la clave dada, haciéndola atómica cuando se usa con tipos incorporados.

    (Contribución de Filip Gruszczyński en bpo-13521.)

  • Los mensajes de error producidos cuando la llamada de una función no coincide con la firma han sido mejorados significativamente.

    (Contribución de Benjamin Peterson.)

Un bloqueo de importación más detallado

Las versiones anteriores de CPython siempre se han basado en un bloqueo de importación global. Ésto conduce a problemas inesperados tales como bloqueos cuando la importación un módulo debería disparar la ejecución de código en un hilo diferente como un efecto secundario. A veces se empleaban soluciones torpes, como la función de API C PyImport_ImportModuleNoBlock() .

En Python 3.3, la importación de un módulo toma un bloqueo por módulo. Esto serializa correctamente la importación de un módulo determinado a partir de múltiples subprocesos (impidiendo la exposición de módulos inicializados incompletamente), mientras elimina las molestias antes mencionadas.

(Contribución de Antoine Pitrou en bpo-9260.)

Funciones y tipos incorporados

  • open() obtiene un nuevo parámetro opener: el descriptor de archivo subyacente para el objeto de archivo se obtiene llamando a opener con (file, flags). Se puede utilizar para utilizar banderas personalizadas como os.O_CLOEXEC, por ejemplo. Se ha añadido el modo 'x' : abierto para la creación exclusiva, fallando si el archivo ya existe.

  • print(): agregó el argumento de palabra clave flush. Si el argumento de palabra clave flush es verdadero, la secuencia se vacía por la fuerza.

  • hash(): la aleatorización de hash está habilitada de forma predeterminada, consulte object.__hash__() y PYTHONHASHSEED.

  • El tipo str obtiene un nuevo método casefold(): retorna una copia de la cadena con mayúsculas y minúsculas, las cadenas con mayúsculas y minúsculas se pueden utilizar para la coincidencia sin mayúsculas. Por ejemplo, 'ß'.casefold() retorna 'ss'.

  • La documentación de secuencia se ha reescrito sustancialmente para explicar mejor la distinción de secuencia binaria/texto y para proporcionar secciones de documentación específicas para los tipos de secuencia individuales integrados(bpo-4966).

Nuevos módulos

faulthandler

Este nuevo módulo de depuración faulthandler contiene funciones para volcar los rastreos de Python explícitamente, en una falla (como una falla de segmentación), después de un tiempo de espera o en una señal de usuario. Llame a faulthandler.enable() para instalar controladores de fallas para las señales SIGSEGV, SIGFPE, SIGABRT, SIGBUS, y SIGILL . También puede habilitarlos al inicio configurando la variable de entorno PYTHONFAULTHANDLER o usando la opción de línea de comandos -X faulthandler .

Ejemplo de una falla de segmentación en Linux:

$ python -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault

Current thread 0x00007fb899f39700:
  File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
  File "<stdin>", line 1 in <module>
Segmentation fault

ipaddress

El nuevo módulo ipaddress proporciona herramientas para crear y manipular objetos que representen direcciones, redes e interfaces IPv4 e IPv6 (es decir, alguna dirección IP asociada con una subred IP específica)

(Contribución de Google y Peter Moody en PEP 3144 )

lzma

El módulo lzma recién agregado proporciona compresión y descompresión de datos utilizando el algoritmo LZMA, incluida la compatibilidad con los formatos de archivo .xz y .lzma.

(Contribución de Nadeem Vawda y Per Øyvind Karlsen en bpo-6715.)

Módulos mejorados

abc

Soporte mejorado para las clases base abstractas que contienen descriptores compuestos con métodos abstractos. El enfoque recomendado para declarar descriptores abstractos ahora es proporcionar __isabstractmethod__ como una propiedad actualizada dinámicamente. Los descriptores integrados han sido actualizados en consecuencia.

(Contribución de Darren Dale en bpo-11610. )

El método abc.ABCMeta.register() ahora retorna las subclases registradas, lo cual significa que ahora éste puede ser usado como un decorador de clases (bpo-10868).

array

El módulo array admite el tipo long long utilizando los códigos de tipo q y Q.

(Contribución de Oren Tirosh y Hirokazu Yamamoto en bpo-1172711.)

base64

Las cadenas Unicode de solo ASCII ahora son aceptadas por las funciones de decodificación de la interfaz moderna base64. Por ejemplo, base64.b64decode ('YWJj') retorna b'abc'. (Contribución por Catalin Iacob en: número: 13641.)

binascii

Además de los objetos binarios que normalmente aceptan, las funciones a2b_ ahora también aceptan cadenas de sólo ASCII como dato de entrada. (Contribución por Antoine Petrou en bpo-13637.)

bz2

El módulo bz2 ha sido reescrito desde cero. Durante el proceso, han sido agregadas varias características:

  • Nueva función bz2.open(): abre un archivo comprimido por bzip2, en modo binario o en modo de texto.

  • bz2.BZ2File ahora puede leer y escribir en objetos de tipo archivo arbitrarios, mediante el argumento fileobj de su constructor.

    (Contribución de Nadeem Vawda en bpo-5863.)

  • La clase bz2.BZ2File y la función bz2.decompress() ahora descomprimen entradas de flujo múltiple (como las producidas por la herramienta pbzip2). La clase bz2.BZ2File ahora puede ser usada también para crear este tipo de archivos, usando el modo 'a' (agregar).

    (Contribución de Nir Aides en bpo-1625.)

  • La clase bz2.BZ2File ahora implementa toda la API io.BufferedIOBase, excepto los métodos detach() y truncate().

códecs

El códec mbcs ha sido reescrito para manejar correctamente los controladores de error reemplazar e ignorar en todas las versiones Windows. El códec mbcs ahora admite todos los controladores de error, en lugar de solo replace para codificar e ignore para decodificar.

Ha sido agregado un nuevo códec únicamente para windows: cp65001 (bpo-13216). Es la página de códigos de Windows con el código 65001 (Windows UTF-8, CP_UTF8). Por ejemplo, es usado por sys.stdout si la página de códigos de salida de la consola se establece en cp65001 (por ejemplo, usando el comando chcp 65001).

Los decodificadores CJK multibyte ahora se re-sincronizan más rápido. Solo ignoran el primer byte de una secuencia de bytes no válida. Por ejemplo, b'\xff\n'.decode('gb2312', 'replace') ahora retorna un \n después del carácter de reemplazo.

(bpo-12016)

Los codificadores de códec incrementales CJK ya no se restablecen en cada llamada a sus métodos encode(). Por ejemplo:

>>> import codecs
>>> encoder = codecs.getincrementalencoder('hz')('strict')
>>> b''.join(encoder.encode(x) for x in '\u52ff\u65bd\u65bc\u4eba\u3002 Bye.')
b'~{NpJ)l6HK!#~} Bye.'

Este ejemplo resulta b'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} Bye.' con versiones anteriores de Python.

(bpo-12100)

El códec unicode_internal ha quedado obsoleto.

colecciones

Adición de una nueva ChainMap para permitir el tratamiento de un número de asignaciones como una sola unidad. (Escrito por Raymond Hettinger para bpo-11089, publicado en bpo-11297.)

Las clases base abstractas se han movido en un nuevo módulo collections.abc, para diferenciar mejor entre las clases de colecciones abstractas y concretas. Los alias para ABC siguen presentes en el módulo collections para preservar las importaciones existentes. (bpo-11085)

La clase Counter ahora admite los operadores “”+”” y “”-”” unarios, así como los operadores in situ +=, -=, |=, and &=. (Contribución de Raymond Hettinger en bpo-13121.)

contextlib

ExitStack ahora proporciona una base sólida para la manipulación programática de los administradores de contexto y una funcionalidad de limpieza similar. A diferencia de la API anterior contextlib.nested (que estaba en desuso y se eliminó), la nueva API está diseñada para funcionar correctamente independientemente de si los administradores de contexto adquieren sus recursos en su método __init__ (por ejemplo, objetos de archivo) o en su método __enter__ (por ejemplo, objetos de sincronización del módulo threading).

(bpo-13585)

crypt

Adición de sal y formato de cripta modular (método de hashing) y la función mksalt() al módulo crypt.

(bpo-10924)

curses

  • Si el módulo curses es vinculado a la nueva librería ncursesw, se usan las funciones Unicode cuando se pasen cadenas o caracteres Unicode (por ejemplo, la función waddwstr()) o en caso contrario, funciones de bytes (e.g. waddstr()).

  • Usa la codificación local en vez de utf-8 para codificar cadenas Unicode.

  • La clase curses.window tiene un nuevo atributo curses.window.encoding.

  • La clase curses.window tiene un nuevo método get_wch() para obtener un caracter ancho

  • El módulo curses tiene una nueva función unget_wch() para enviar un caracter ancho de manera que el próximo get_wch() lo retorne

(Contribución por Iñigo Serna en bpo-6755.)

datetime

decimal

bpo-7652 - integrar la aritmética decimal nativa rápida.

Módulo C y libmpdec escritos por Stefan Krah.

The new C version of the decimal module integrates the high speed libmpdec library for arbitrary precision correctly rounded decimal floating-point arithmetic. libmpdec conforms to IBM’s General Decimal Arithmetic Specification.

Performance gains range from 10x for database applications to 100x for numerically intensive applications. These numbers are expected gains for standard precisions used in decimal floating-point arithmetic. Since the precision is user configurable, the exact figures may vary. For example, in integer bignum arithmetic the differences can be significantly higher.

La siguiente tabla está pensada como una ilustración. Los puntos de referencia están disponibles en https://www.bytereef.org/mpdecimal/quickstart.html.

decimal.py

_decimal

speedup

pi

42.02s

0.345s

120x

telco

172.19s

5.68s

30x

psycopg

3.57s

0.29s

12x

Características

  • La señal FloatOperation habilita opcionalmente las semánticas estrictas para mezclar decimales y flotantes.

  • Si python se compila sin subprocesos, la versión C deshabilita automáticamente la costosa maquinaria de contexto local de subprocesos. En éste caso, la variable HAVE_THREADS se establece en False.

Cambios en la API

  • El módulo C tiene los siguientes límites de contexto, dependiendo de la arquitectura de la máquina:

    32-bit

    64-bit

    MAX_PREC

    425000000

    999999999999999999

    MAX_EMAX

    425000000

    999999999999999999

    MIN_EMIN

    -425000000

    -999999999999999999

  • En las plantillas de contexto (DefaultContext, BasicContext and ExtendedContext) la magnitud de Emax y Emin se ha cambiado a 999999.

  • El constructor Decimal en decimal.py no observa los límites de contexto y convierte valores con exponentes arbitrarios o precisión exacta. Dado que la versión C tiene límites internos, se usa el siguiente esquema: Si es posible, los valores son convertidos a valores exactos, de lo contrario se genera InvalidOperation y el resultado es NaN. En éste último caso siempre es posible usar create_decimal() para obtener un valor redondeado o inexacto.

  • La función de potencia en decimal.py siempre se redondea correctamente. En la versión C, se define en términos de las funciones exp() y ln() correctamente redondeadas, pero el resultado final es solo «casi siempre correctamente redondeado».

  • En la versión C, el diccionario de contexto que contiene las señales, es una MutableMapping. Por razones de velocidad, flags y traps siempre se refiere a la misma MutableMapping que el contexto con el que se inicializó. Si se asigna un nuevo diccionario de señales, flags y traps son actualizados con los nuevos valores, pero no hacen referencia al diccionario RHS.

  • Decapar a Context produce una salida diferente para tener un formato de intercambio común para las versiones de Python y C.

  • El orden de los argumentos en el constructor de la clase Context, ha sido cambiado para que coincida con el orden mostrado por la función repr().

  • El parámetro watchexp en el método quantize() ha quedado obsoleto.

email

Marco de políticas

El paquete de correo electrónico ahora tiene un marco policy. Un Policy es un objeto con varios métodos y propiedades que controlan el comportamiento del paquete de correo electrónico. La política principal de Python 3.3 es la política Compat32, que proporciona compatibilidad con versiones anteriores del paquete de correo electrónico en Python 3.2. Se puede especificar una policy cuando un mensaje de correo electrónico es analizado por un parser, o cuando se crea un objeto Message, o cuando se serializa un correo electrónico mediante un generator. A menos que se invalide, una política pasada a un parser es heredada por todos los objetos Message y los subobjetos creados por el parser. De forma predeterminada, un generator utilizará la política del objeto Message que está serializando. La directiva predeterminada es compat32.

El conjunto mínimo de controles implementado por todos los objetos policy son:

max_line_length

La longitud máxima, excluyendo el(los) caracter(es) linesep, que las líneas individuales pueden tener cuando un Message se serializa es por defecto de 78.

linesep

El caracter usado para separar las líneas individuales cuando se serializa un Message es por defecto \n.

cte_type

7bit or 8bit. 8bit sólo se aplica a un Bytes generator, y significa que pueden utilizarse «no ASCII» cuando lo permita el protocolo (o cuando exista en la entrada original).

raise_on_defect

Hace que un “”analizador”” genere el error cuando se encuentran defectos en lugar de agregarlos a la lista “”Mensaje”” del objeto “”defectos””.

Una nueva instancia de directiva, con nueva configuración, se crea mediante el método clone() de objetos de política. clone toma cualquiera de los controles anteriores como argumentos de palabra clave. Cualquier control no especificado en la llamada conserva su valor predeterminado. Por lo tanto, puede crear una directiva que utilice caracteres linesep \r\n como este:

mypolicy = compat32.clone(linesep='\r\n')

Las directivas pueden ser usadas para facilitar la generación de mensajes en el formato requerido por la aplicación. En vez de tener que recordar especificar linesep='\r\n' en todos los lugares en donde llamas a generator, puedes especificarlo una sola vez cuando estableces la política usada por el analizador o el Mensaje, el que tu programa utilice para crear los objetos Mensaje. Por otra parte, si necesitas generar mensajes en múltiples formas, aún puedes especificar los parámetros en la llamada al generador apropiado. O puedes tener instancias de política personalizadas para tus distintos casos, y pasarlos al crear el generator.

Política provisional con nueva API de encabezado

Aunque el marco de políticas vale la pena por sí solo, la principal motivación para presentarlo es permitir la creación de nuevas políticas que implementen nuevas características para el paquete de correo electrónico, de modo que mantenga la compatibilidad con versiones anteriores para aquellos quienes no usen las nuevas directivas. Dado que las nuevas políticas introducen una nueva API, estamos lanzándolas en Python 3.3 como una provisional policy. Pueden producirse cambios incompatibles con versiones anteriores (hasta la eliminación del código) si los desarrolladores principales lo consideran necesario.

Las nuevas directivas son instancias de EmailPolicy, y agregan los siguientes controles adicionales:

refold_source

Controla si los encabezados analizados por un parser son replegados por generator. Éste puede ser none, long, o all. El valor por defecto es long, lo que significa que los encabezados principales con una linea más larga que max_line_length se repliegan. none significa que no se repliega ninguna linea, y all significa que todas las lineas son replegadas.

header_factory

Un invocable que toma un nombre y un valor y produce un objeto de encabezado personalizado.

El header_factory es la clave a las nuevas características proporcionadas por las nuevas directivas. Cuando se usa una de las nuevas directivas, cualquier encabezado retornado por un objeto Message es un objeto producido por el header_factory, y en cualquier momento que se establece un encabezado en un Message, éste se convierte en un objeto producido por header_factory. Todos éstos objetos de encabezado tienen un atributo name igual al nombre del encabezado. Los encabezados de direcciones y fechas tienen atributos adicionales que te dan acceso a los datos analizados del encabezado. Ésto significa que ahora puedes hacer cosas como ésta:

>>> m = Message(policy=SMTP)
>>> m['To'] = 'Éric <foo@example.com>'
>>> m['to']
'Éric <foo@example.com>'
>>> m['to'].addresses
(Address(display_name='Éric', username='foo', domain='example.com'),)
>>> m['to'].addresses[0].username
'foo'
>>> m['to'].addresses[0].display_name
'Éric'
>>> m['Date'] = email.utils.localtime()
>>> m['Date'].datetime
datetime.datetime(2012, 5, 25, 21, 39, 24, 465484, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000), 'EDT'))
>>> m['Date']
'Fri, 25 May 2012 21:44:27 -0400'
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400

Notarás que el nombre de visualización Unicode se codifica automáticamente como utf-8 cuando se serializa el mensaje, pero que cuando se accede al encabezado directamente, obtienes la versión unicode. Ésto elimina cualquier necesidad de lidiar con las funciones email.header decode_header() or make_header().

También puedes crear direcciones a partir de partes:

>>> m['cc'] = [Group('pals', [Address('Bob', 'bob', 'example.com'),
...                           Address('Sally', 'sally', 'example.com')]),
...            Address('Bonzo', addr_spec='bonz@laugh.com')]
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400
cc: pals: Bob <bob@example.com>, Sally <sally@example.com>;, Bonzo <bonz@laugh.com>

La decodificación a Unicode se realiza automáticamente:

>>> m2 = message_from_string(str(m))
>>> m2['to']
'Éric <foo@example.com>'

Cuando analizas un mensaje, puedes usar los atributos addresses y groups de los objetos de encabezado, para acceder a los grupos y direcciones individuales:

>>> m2['cc'].addresses
(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com'), Address(display_name='Bonzo', username='bonz', domain='laugh.com'))
>>> m2['cc'].groups
(Group(display_name='pals', addresses=(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com')), Group(display_name=None, addresses=(Address(display_name='Bonzo', username='bonz', domain='laugh.com'),))

En resumen, si usas una de las nuevas directivas, la manipulación de encabezados funciona del modo que debería: Su aplicación funciona con cadenas unicode, y el paquete de correo electrónico codifica y decodifica de forma transparente el unicode desde y hacia las codificaciones de transferencia de contenido estándar RFC.

Otros cambios en la API

Nuevo BytesHeaderParser, añadido al módulo parser para complementar HeaderParser y completar la API Bytes.

Nuevas funciones de utilidad:

ftplib

  • ftplib.FTP ahora acepta un argumento de palabra clave source_address para especificar el (host, port) que se usará como dirección de origen en la llamada de enlace al crear el socket saliente. (Contribución de Giampaolo Rodolà en bpo-8594.)

  • La clase FTP_TLS ahora proporciona una nueva función ccc() para revertir el canal de control a texto sin formato. Esto puede ser útil para aprovechar los firewalls que saben cómo manejar NAT con FTP no seguro sin abrir puertos fijos. (Contribución de Giampaolo Rodolà en bpo-12139.)

  • Añadido el método ftplib.FTP.mlsd() que proporciona un formato de listado de directorios analizable y pone en desuso ftplib.FTP.nlst() y ftplib.FTP.dir(). (Contribución de Giampaolo Rodolà en bpo-11072.)

functools

El decorador functools.lru_cache() ahora acepta un argumento de palabra clave typed (que por defecto tiene el valor False para asegurar que almacene en caché valores de diferentes tipos que se comparen igual en ranuras separadas de caché. (Contribución de Raymond Hettinger en bpo-13227.)

gc

Ahora es posible registrar devoluciones de llamadas invocadas por el recolector de basura antes y después de la recolección, utilizando la nueva lista callbacks.

hmac

Se ha agregado una nueva función compare_digest() para prevenir los ataques de canales adyacentes en resúmenes durante el análisis de tiempos. (Contribución de Nick Coghlan y Christian Heimes en bpo-15061.)

http

http.server.BaseHTTPRequestHandler ahora almacena en buffer los encabezados y los escribe todos a la vez cuando se llama a end_headers(). Se puede usar un nuevo método flush_headers() para administrar directamente cuándo se envían los encabezados acumulados. (Contribución por Andrew Schaaf en bpo-3709.)

http.server ahora produce una salida HTML 4.01 strict válida. (Contribución de Ezio Melotti in bpo-13295)

La clase http.client.HTTPResponse ahora tiene un método readinto(), lo que significa que puede ser usado como una clase io.RawIOBase. (Contribución de John Kuhn in bpo-13464)

html

html.parser.HTMLParser ahora puede analizar el marcado no válido sin generar errores, por lo tanto, el argumento strict del constructor y la excepción HTMLParseError ahora están en desuso. La habilidad de analizar marcado inválido es el resultado de un número de correcciones que también están disponibles en la última versión de solución de bugs de Python 2.7/3.2. (Contribución de Ezio Melotti en bpo-15114, y bpo-14538, bpo-13993, bpo-13960, bpo-13358, bpo-1745761, bpo-755670, bpo-13357, bpo-12629, bpo-1200313, bpo-670664, bpo-13273, bpo-12888, bpo-7311.)

Se ha agregado un nuevo diccionario html5 que asigna referencias de caracteres con nombre HTML5 a los caracteres Unicode equivalentes (por ejemplo, html5['gt;'] == '>') ha sido agregado al módulo html.entities. El diccionario ahora también es utilizado por HTMLParser. (Contribución por Ezio Melotti en bpo-11113 y bpo-15156.)

imaplib

El constructor de IMAP4_SSL ahora acepta un parámetro SSLContext para controlar los parámetros del canal seguro.

(Contribución de Sijin Joseph en bpo-8808.)

inspect

Se ha añadido una nueva función getclosurevars(). Esta función notifica el enlace actual de todos los nombres a los que se hace referencia desde el cuerpo de la función y dónde se resolvieron esos nombres, lo que facilita la comprobación del estado interno correcto al probar el código que se basa en cierres con estado.

(Contribución de Meador Inge y Nick Coghlan en bpo-13062.)

Se ha añadido una nueva función getgeneratorlocals(). Esta función informa del enlace actual de variables locales en el marco de pila del generador, lo que facilita la comprobación del estado interno correcto al probar generadores.

(Contribución de Meador Inge en bpo-15153.)

io

La función open() tiene un nuevo modo 'x' que puede ser usado exclusivamente para crear un nuevo archivo, y lanzar un FileExistsError si el archivo ya existe. Este está basado en el modo C11 “x” para fopen().

(Contribución de David Townsend en bpo-12760.)

El constructor de la clase TextIOWrapper tiene un nuevo argumento opcional write_through. Si write_through es True, se garantiza que las llamadas a write() no se almacenarán en buffer: Cualquier dato escrito en el objeto TextIOWrapper es llevado inmediatamente a su buffer subyacente.

itertools

accumulate() ahora toma un argumento opcional func para proporcionar una función binaria proporcionada por el usuario.

logging

La función basicConfig() ahora admite un argumento opcional handlers tomando un iterable de manejadores para agregarlo en el registrador raíz.

Un atributo de nivel de la clase append_nul ha sido agregado a la clase SysLogHandler para permitir el control de la adición de NUL (\000) byte a los registros de syslog, dado que para algunos demonios es requerido mientras que para otros se pasa al registro.

math

El módulo math tiene una nueva función, log2(), la cual retorna el logaritmo de x en base 2.

(Escrito por Mark Dickinson en bpo-11888.)

mmap

El método read() ahora es más compatible con otros objetos similares a archivos: Si se omite el argumento o se especifica como None, retorna los bytes desde la posición actual hasta el final del mapeo. (Contribución de Petri Lehtinen en bpo-12021.)

multiprocesamiento

La nueva función multiprocessing.connection.wait() permite sondear varios objetos (como conexiones, sockets y tuberías) con un tiempo de espera. (Contribución de Richard Oudkerk en bpo-12328.)

Los objetos multiprocessing.Connection ahora se pueden transferir a través de conexiones de multiprocesamiento. (Contribución de Richard Oudkerk en bpo-4892.)

multiprocessing.Process ahora acepta un argumento de palabra clave daemon para invalidar el comportamiento predeterminado de heredar el indicador daemon del proceso primario (bpo-6064).

Nuevo atributo multiprocessing.Process.sentinel permite que un programa espere múltiples objetos Process a la vez utilizando las primitivas adecuadas del sistema operativo (por ejemplo, select en sistemas posix).

Los nuevos métodos multiprocessing.pool.Pool.starmap() y starmap_async() proporcionan itertools.starmap() equivalentes a las funciones existentes multiprocessing.pool.Pool.map() y map_async(). (Contribución de Hynek Schlawack en bpo-12708.)

nntplib

La nntplib.NNTP ahora admite el protocolo de administración de contexto para consumir incondicionalmente las excepciones socket.error y cerrar la conexión NNTP cuando esté listo:

>>> from nntplib import NNTP
>>> with NNTP('news.gmane.org') as n:
...     n.group('gmane.comp.python.committers')
...
('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
>>>

(Contribución de Giampaolo Rodolà en bpo-9795.)

os

  • El módulo os tiene una nueva función pipe2() que hace posible crear una tubería con banderas O_CLOEXEC o O_NONBLOCK establecida automáticamente. Esto es especialmente útil para evitar las condiciones de carrera en programas multi-hilos.

  • El módulo os tiene una nueva función sendfile() que proporciona una forma eficiente de «copia cero» para copiar datos desde un descriptor de archivo (o socket) a otro. La frase «copia cero» se refiere al hecho de que la copia de los datos entre dos descriptores es realizada en su totalidad por el kernel, sin copiar los datos en los búferes del espacio de usuario. La función sendfile() puede ser usada para copiar datos de forma eficiente desde un archivo en el disco a un conector de red, por ejemplo para descargar un archivo.

    (Revisión enviada por Ross Lagerwall y Giampaolo Rodolà en bpo-10882.)

  • Para evitar las condiciones de carrera, como los ataques symlink, y errores con archivos temporales y directorios, es preferible (y más rápido) manipular los descriptores de archivos en vez de los nombres de archivos. Python 3.3 mejora las funciones existentes e introduce nuevas funciones para trabajar con los descriptores de archivos (bpo-4761, bpo-10755 and bpo-14626).

  • access() acepta un argumento de palabra clave effective_ids acepta el uso del uid/gid efectivo en lugar del uid/gid real en la comprobación de acceso. El soporte de la plataforma para ésto, se puede comprobar a través del conjunto supports_effective_ids.

  • El módulo os tiene dos nuevas funciones getpriority() y setpriority(). Estas pueden ser usadas para establecer o recuperar la prioridad en una forma similar a os.nice() pero extendidos a todos los procesos en vez de solo al proceso actual.

    (Revisión enviada por Giampaolo Rodolà en bpo-10784.)

  • La nueva función os.replace() permite cambiar el nombre de un archivo entre plataformas sobrescribiendo el destino. Con os.rename(), un archivo de destino existente se sobrescribe bajo POSIX, pero lanza un error en Windows. (Contribución de Antoine Pitrou en bpo-8828.)

  • La familia de estadísticas de funciones (stat(), fstat(), y lstat()) ahora admite la lectura de marcas de tiempo de un archivo con precisión de nanosegundos. Simétricamente, utime() ahora puede escribir marcas de tiempo de archivos con precisión de nanosegundos. (Contribución de Larry Hastings en bpo-14127.)

  • La nueva función os.get_terminal_size() consulta el tamaño del terminal adjunto al descriptor del archivo. Vea también shutil.get_terminal_size(). (Contribución de Zbigniew Jędrzejewski-Szmek en bpo-13609. )

pdb

La finalización de tabulaciones ahora está disponible no solo para los nombres de los comandos, sino también para sus argumentos. Por ejemplo, para el comando break, se completan las funciones y los nombres de archivo.

(Contribución de Georg Brandl en bpo-14210)

pickle

Los objetos pickle.Pickler ahora tienen un atributo opcional dispatch_table que permite establecer funciones de reducción por recolector.

(Contribución de Richard Oudkerk in bpo-14166.)

pydoc

La Tk GUI y la función serve() han sido eliminadas del módulo pydoc: pydoc -g y serve() han quedado obsoletos en Python 3.2.

re

Las expresiones regulares de la clase str ahora admiten escapes de \u and \U .

(Contribución de Serhiy Storchaka en bpo-3665.)

sched

  • run() ahora acepta un parámetro blocking que al configurarse en false, hace que el método ejecute los eventos planificados debido a la pronta expiración (si corresponde) y luego responde inmediatamente. Esto es útil en caso de que quieras usar la scheduler en aplicaciones sin bloqueo. (Contribución de Giampaolo Rodolà in bpo-13449.)

  • La clase scheduler ahora se puede utilizar de forma segura en entornos multiproceso. (Contribución por Josiah Carlson y Giampaolo Rodolà en bpo-8684.)

  • Los parámetros timefunc y delayfunct del constructor de la clase scheduler ahora son opcionales y tienen el valor predeterminado time.time() y time.sleep() respectivamente. (Contribución de Chris Clark en bpo-13245.)

  • El parámetro argument de enter() and enterabs() ahora es opcional. (Contribución de Chris Clark en bpo-13245.)

  • enter() y enterabs() ahora aceptan un parámetro kwargs. (Contribución de Chris Clark en bpo-13245.)

select

Solaris y plataformas derivadas tienen una nueva clase select.devpoll para sockets asincrónicos de alto rendimiento a través de /dev/poll. (Contribución de Jesús Cea Avión en bpo-6397.)

shlex

La función auxiliar previamente indocumentada quote de los módulos pipes se ha movido al módulo shlex y se ha documentado. quote() escapa correctamente a todos los caracteres de una cadena que de otro modo podría tener un significado especial por el shell.

shutil

  • Nuevas funciones:

    • disk_usage(): Proporciona estadísticas sobre el espacio total, usado, y libre en el disco. (Contribución de Giampaolo Rodolà in bpo-12442.)

    • chown(): Permite cambiar el usuario y/o grupo de las rutas dadas, además de especificar los nombres de usuario/grupo, y no solos sus id’s numèricos. (Contribución de Sandro Tosi in bpo-12191.)

    • shutil.get_terminal_size(): Retorna el tamaño de la ventana del terminar a la cual se adjunta el intérprete. (Contribución de Zbigniew Jędrzejewski-Szmek in bpo-13609. )

  • copy2() and copystat() ahora conservan las marcas de tiempo de archivos con precisión de nanosegundos en plataformas que lo soporten. También conservan los «atributos extendidos» de archivo en Linux (Contribución de Larry Hastings en bpo-14127 y bpo-15238.)

  • Algunas funciones ahora toman un argumento opcional de symlinks: Cuando ese parámetro es verdadero, los enlaces simbólicos no se desreferencian y la operación actúa en el enlace simbólico en sí. (o crea uno, si es relevante). (Contribución de Hynek Schlawack in bpo-12715.)

  • Al copiar archivos a un sistema de archivos diferente, move() ahora gestiona los enlaces simbólicos de la forma que lo hace el comando mv de posix, recreando el enlace simbólico en vez de copiar el contenido del archivo de destino. (Contribución de Jonathan Niehof en bpo-9993.) move() ahora también retorna el argumento dst como resultado.

  • rmtree() ahora es resistente a los ataques de enlaces simbólicos en plataformas que admiten el nuevo parámetro dir_fd en os.open() y os.unlink(). (Contribución de Martin von Löwis and Hynek Schlawack in bpo-4489.)

signal

  • El módulo signal tiene nuevas funciones:

  • El manejador de señales escribe el número de señal, como un único byte en vez de un byte nulo en el descriptor del archivo de activación. Por lo tanto, es posible esperar más de una señal y saber cuales señales han sido lanzadas.

  • signal.signal() y signal.siginterrupt() lanzan un OSError, en vez de un RuntimeError: OSError no tiene atributo errno.

smtpd

The smtpd module now supports RFC 5321 (extended SMTP) and RFC 1870 (size extension). Per the standard, these extensions are enabled if and only if the client initiates the session with an EHLO command.

Soporte inicial de ELHO de Alberto Treviño. Ampliación de tamaño por Juhana Jauhiainen. Trabajo adicional sustancial en la revisión aportada por Michele Orrù y Dan Boswell. bpo-8739)

smtplib

Las clases SMTP, SMTP_SSL, y LMTP ahora aceptan un argumento de palabra clave source_address, para especificar el (host, port) a usar como dirección de origen en la llamada de enlace al crear el socket saliente. (Contribución de Paulo Scardine en bpo-11281.)

SMTP ahora admite el protocolo de administración de contexto, permitiendo usar a una instancia SMTP en una declaración with. (Contribución de Giampaolo Rodolà en bpo-11289.)

El constructor SMTP_SSL y el método starttls() ahora aceptan un parámetro SSLContext, para controlar los parámetros del canal seguro. (Contribución por Kasun Herath en bpo-8809.)

socket

socketserver

BaseServer ahora tiene un método reemplazable service_actions() que es llamado por el método serve_forever() en el ciclo del servicio. ForkingMixIn ahora usa ésto para limpiar procesos secundarios zombies. (Contribución de Justin Warkentin en bpo-11109.)

sqlite3

Nuevo método sqlite3.Connection set_trace_callback() puede ser usado para capturar un rastro de todos los comandos sql procesados por sqlite. (Contribución de Torsten Landschoff en bpo-11688.)

ssl

  • El módulo ssl tiene dos funciones de generación aleatoria:

    • RAND_bytes(): genera bytes pseudo-aleatorios criptográficamente fuertes.

    • RAND_pseudo_bytes(): genera bytes pseudoaleatorios.

    (Contribución de Victor Stinner en bpo-12049.)

  • El módulo ssl ahora expone una jerarquía de excepciones más detallada para facilitar la inspección de varias clases de errores. (Contribución de Antoine Pitrou en bpo-11183.)

  • load_cert_chain() ahora acepta un argumento password que será usado si la clave privada es encriptada. (Contribución de Adam Simpkins en bpo-12803.)

  • El intercambio de claves Diffie-Hellman, tanto regular como basado en curvas elípticas, ahora se admite a través de los métodos load_dh_params() y set_ecdh_curve(). (Contribución de Antoine Pitrou en bpo-13626 y bpo-13627.)

  • Los sockets SSL tienen un nuevo método get_channel_binding() que permite la implementación de ciertos mecanismos de autenticación tales como SCRAM-SHA-1-PLUS. (Contribución por Jacek Konieczny en bpo-12551.)

  • Puedes consultar el algoritmo de compresión SSL usado por un socket SSL, gracias a su nuevo método compression(). El nuevo atributo OP_NO_COMPRESSION puede ser usado para deshabilitar la compresión. (Contribución de Antoine Pitrou en bpo-13634.)

  • Se ha agregado soporte para la extensión Next Protocol Negotiation usando el método ssl.SSLContext.set_npn_protocols(). (Contribución por Colin Marc en bpo-14204.)

  • Los errores de SSL ahora pueden introspectarse más fácilmente gracias a los atributos library y reason. (Contribución de Antoine Pitrou en bpo-14837.)

  • La función get_server_certificate() ahora admite IPv6. (Contribución por Charles-François Natali en bpo-11811.)

  • El nuevo atributo OP_CIPHER_SERVER_PREFERENCE permite configurar los sockets del servidor SSLv3 para usar la preferencia de ordenación de cifrado del servidor en lugar de la del cliente. (bpo-13635).

stat

La función indocumentada tarfile.filemode ha sido movida a stat.filemode(). Este puede ser usado para convertir el modo de un archivo a una cadena de la forma “-rwxrwxrwx”.

(Contribución de Giampaolo Rodolà in bpo-14807.)

struct

El módulo struct ahora admite ssize_t y size_t a través de los nuevos códigos n and N, respectivamente. (Contribución de Antoine Pitrou en bpo-3163.)

subprocess

Las cadenas de comandos ahora pueden ser objetos de bytes en las plataformas posix. (Contribución de Victor Stinner in bpo-8513.)

Una nueva constante DEVNULL permite suprimir la salida de forma independiente de la plataforma. (Contribución de Ross Lagerwall en bpo-5870.)

sys

El módulo sys tiene un nuevo thread_info named tuple que almacena información sobre la implementación del hilo (bpo-11223).

tarfile

tarfile ahora admite la codificación lzma a través del módulo lzma. (Contribución de Lars Gustäbel en bpo-5689.)

tempfile

El método tempfile.SpooledTemporaryFile's truncate() ahora acepta un parámetro size. (Contribución de Ryan Kelly en bpo-9957.)

textwrap

El módulo textwrap tiene una nueva función indent() que facilita la adición de un prefijo común para las lineas seleccionadas en un bloque de texto (bpo-13857).

threading

threading.Condition, threading.Semaphore, threading.BoundedSemaphore, threading.Event, y threading.Timer, todas las cuales son usadas para ser funciones de fábrica que retornen una instancia de clase, ahora son clases y pueden ser subclasificadas (Contribución de Éric Araujo in bpo-10968.)

El constructor de la clase threading.Thread ahora acepta un argumento de palabra clave daemon para anular el comportamiento predeterminado de heredar el valor del indicador daemon desde el hilo principal (bpo-6064).

La función anteriormente privada _thread.get_ident ahora está disponible como función pública threading.get_ident(). Ésto elimina varios casos de acceso directo al módulo _thread en el stdlib. El código de terceros que usaba _thread.get_ident debería de igual forma ser cambiado para usar la nueva interfaz pública.

time

El PEP 418 agrega nuevas funciones al módulo time:

  • get_clock_info(): Obtiene información en un reloj.

  • monotonic(): Reloj monotónico (no se puede retroceder), no se ve afectado por la actualización del reloj del sistema.

  • perf_counter(): Contador de rendimiento con la más alta resolución disponible para medir una corta duración.

  • process_time(): Suma del tiempo de CPU del sistema y del usuario del proceso actual.

Otras nuevas funciones:

Para mejorar la consistencia entre plataformas, la función sleep() ahora lanza un ValueError cuando se le pasa un valor negativo. Esto era anteriormente un error en posix, pero producía una suspensión definitiva en windows.

types

Adición de una nueva clase types.MappingProxyType: Proxy de solo lectura de una asignación. (bpo-14386)

Las nuevas funciones types.new_class() y types.prepare_class() proporcionan soporte para la creación de tipos dinámicos compatibles. (bpo-14588)

unittest

Los métodos assertRaises(), assertRaisesRegex(), assertWarns(), y assertWarnsRegex() ahora aceptan un argumento de palabra clave msg cuando son usados como administradores de contexto. (Contribución por Ezio Melotti y Winston Ewert en bpo-10775.)

unittest.TestCase.run() ahora retorna el objeto TestResult.

urllib

La clase Request ahora acepta un argumento method usado por get_method() para determinar que método HTTP debería usarse. Por ejemplo, esto enviará una solicitud 'HEAD':

>>> urlopen(Request('https://www.python.org', method='HEAD'))

(bpo-1673007)

webbrowser

El módulo webbrowser admite más «navegadores»: Google Chrome (llamado chrome, chromium, chrome-browser or chromium-browser dependiendo de la versión y del sistema operativo), y los lanzadores genéricos xdg-open, del proyecto FreeDesktop.org, y gvfs-open, el cual es el controlador URI predeterminado para GNOME3. (El primero agregado por Arnaud Calmettes en bpo-13620, el segundo por Matthias Klose en bpo-14493.)

xml.etree.ElementTree

El módulo xml.etree.ElementTree ahora importa su acelerador C predeterminado, ya no es necesario importar explícitamente xml.etree.cElementTree (Éste módulo permanece para compatibilidad con versiones anteriores, pero ya está obsoleto). Además, la familia de métodos iter de Element se ha optimizado (Reescrito en C). La documentación del módulo también se ha mejorado mucho, con ejemplos agregados y una referencia más detallada.

zlib

El nuevo atributo zlib.Decompress.eof permite distinguir entre un flujo comprimido correctamente formado y uno incompleto o truncado. (Aportado por Nadeem Vawda en bpo-12646.)

Nuevo atributo zlib.ZLIB_RUNTIME_VERSION informa la cadena de versión de la biblioteca zlib subyacente que se carga en tiempo de ejecución. (Contribución de Torsten Landschoff en bpo-12306.)

Optimizaciones

Se han agregado importantes mejoras de rendimiento:

  • Gracias a PEP 393, algunas operaciones en las cadenas Unicode han sido optimizadas:

    • la huella de memoria se divide de 2 a 4 según el texto

    • codificar una cadena ASCII a UTF-8 ya no necesita codificar caracteres, la representación UTF-8 se comparte con la representación ASCII

    • el codificador UTF-8 ha sido optimizado

    • repetir una única letra ASCII y obtener una subcadena de una cadena ASCII es 4 veces más rápido

  • UTF-8 ahora es 2x a 4x más rápido. La codificación UTF-16 ahora es 10x más rápida.

    (Contribución de Serhiy Storchaka, bpo-14624, bpo-14738 y bpo-15026.)

Construcción y cambios en la API de C

Los cambios en el proceso de compilación de Python y en la API de C incluyen:

Obsoleto

Sistemas operativos no compatibles

OS/2 y VMS no son compatibles debido a la falta de un responsable de mantenimiento.

Windows 2000 y las plataformas windows que establezcan COMSPEC a command.com ya no son compatibles debido a la carga de mantenimiento.

La compatibilidad con OSF, que quedó obsoleta en 3.2, ha sido completamente eliminada.

Módulos , funciones y métodos obsoletos en Python

Funciones y tipos obsoletos en la API de C

El Py_UNICODE ha quedado obsoleto por PEP 393 y será eliminado en Python 4. Todas las funciones que utilizan éste tipo quedarán en desuso:

Funciones y métodos Unicode que utilizan los tipos Py_UNICODE y Py_UNICODE*:

Funciones y macros que manipulen cadenas de caracteres Py_UNICODE*:

Codificadores:

Características obsoletas

El código del formato 'u' del módulo array ha quedado obsoleto y será eliminado en Python 4, junto con el resto de la API (Py_UNICODE).

Migración a Python 3.3

Esta sección enumera los cambios descritos previamente y otras correcciones que pueden requerir cambios en su código.

Portando código Python

  • La aleatoriedad de Hash ha sido habilitada de forma predeterminada. Establezca la variable de entorno PYTHONHASHSEED a 0, para deshabilitar la aleatoriedad de Hash. Vea también el método object.__hash__() method.

  • bpo-12326: En Linux, sys.platform ya no contiene la versión principal. Ahora siempre es “linux”, en vez de “linux2” o “linux3” dependiendo de la versión de Linux usada para compilar Python. Reemplace sys.platform == “linux2” con sys.platform.startswith(“linux”), o directamente sys.platform == “linux” si no necesita admitir versiones anteriores de Python.

  • bpo-13847, bpo-14180: time y datetime: OverflowError ahora se lanza en lugar de ValueError si una marca de tiempo está fuera de rango. OSError ahora se genera si fallaron las funciones C gmtime() o localtime().

  • Los buscadores predeterminados usados para las importaciones, ahora utilizan un caché de lo que está contenido en un directorio específico. Si crea un archivo fuente de Python o archivo de código de bytes sin fuente, asegúrese de llamar a importlib.invalidate_caches() para limpiar la caché para que los buscadores encuentren el nuevo archivo.

  • ImportError ahora usa el nombre completo del módulo que se intentó importar. Las pruebas de documentos que verifican el mensaje de “ImportErrors” necesitaran ser actualizados para usar el nombre completo del módulo en vez de sólo la terminación del nombre.

  • El argumento index para la función __import__() ahora tiene un valor predeterminado de 0, en vez de -1, y ya no admite valores negativos. Ha sido un descuido en la implementación de PEP 328 que el valor predeterminado permaneciera en -1. Si necesita continuar realizando una importación relativa seguida por una importación absoluta, entonces realice la importación relativa usando un índice de 1, seguida por otra importación que use un índice de 0. Sin embargo, es preferible usar importlib.import_module() en vez de llamar a la función __import__() directamente.

  • __import__() ya no admite usar un valor de índice distinto de 0 para los módulos de alto nivel. Por ejemplo, __import__('sys', level=1) ahora es un error.

  • Dado que sys.meta_path y sys.path_hooks ahora tienen buscadores por defecto, lo más probable es que desee usar list.insert() en vez de list.append() para agregar a esas listas.

  • Dado que None ahora ha sido insertado en sys.path_importer_cache, si usted está borrando entradas en el diccionario de rutas que no tienen un buscador, usted necesitará eliminar los pares con valores de None y imp.NullImporter para ser compatible con versiones anteriores. Esto conducirá a una sobrecarga adicional con las versiones más antiguas de Python que re-inserten None dentro de sys.path_importer_cache donde éste represente el uso de buscadores implícitos, pero semánticamente no debería cambiar nada.

  • importlib.abc.Finder ya no especifica un método abstracto find_module() que debe implementarse. Si confiaba en subclases para implementar ese método, asegúrese de verificar primero la existencia del método. Sin embargo, probablemente querrá verificar primero find_loader(), en el caso de trabajar con path entry finders.

  • pkgutil ha sido convertido para usar importlib internamente. Esto elimina varios casos extremos donde el antiguo comportamiento de la emulación de importación PEP 302 fallaba al comparar el comportamiento del sistema real de importación. La emulación de importación en sí aún está presente, pero está en desuso. Las funciones pkgutil.iter_importers() y pkgutil.walk_packages() en un caso especial son los ganchos de importación estándar, por lo que aún son compatibles aunque no proporcionen el método no estándar iter_modules ().

  • Se ha corregido un error de larga data de cumplimiento de RFC (bpo-1079) en el análisis realizado por email.header.decode_header(). El código que usa el lenguaje estándar para convertir encabezados codificados en unicode (str (make_header (decode_header (h))) no verá cambios, pero el código que mira las tuplas individuales retornadas por decode_header verá ese espacio en blanco que precede o sigue las secciones ASCII ahora está incluido en la sección ASCII. El código que crea encabezados usando make_header también debería continuar funcionando sin cambios, ya que make_header continúa agregando espacios en blanco entre Secciones ASCII y no ASCII si aún no está presente en las cadenas de caracteres entrantes.

  • email.utils.formataddr() ahora realiza la codificación de transferencia de contenido correcta, al pasar nombres para mostrar que no son ASCII. Cualquier código que dependa del comportamiento defectuoso anterior que conservó el unicode que no es ASCII en la cadena de salida formateada deberá cambiarse (bpo-1690608).

  • poplib.POP3.quit() ahora puede generar errores de protocolos como todos los demás métodos poplib. El código que asume que quit no genera errores poplib.error_proto puede necesitar ser cambiado si una aplicación en particular encuentran errores en quit (bpo-11291).

  • El argumento strict para la clase email.parser.Parser, que quedó obsoleto desde Python 2.4, finalmente ha sido eliminado.

  • El método unittest.TestCase.assertSameElements que estaba obsoleto, ha sido eliminado.

  • La variable time.accept2dyear que estaba obsoleta, ha sido eliminada.

  • El atributo Context._clamp que estaba obsoleto, ha sido eliminado del módulo decimal. Este se reemplazó anteriormente por el atributo público clamp. (Ver bpo-8540.)

  • La clase interna auxiliar indocumentada SSLFakeFile, ha sido eliminada de smtplib, dado que su funcionalidad ha sido proporcionada directamente por socket.socket.makefile().

  • El paso de valores negativos a la función time.sleep() en Windows, ahora lanza un error en vez de detenerse definitivamente. Este siempre ha lanzado un error en posix.

  • La constante ast.__version__ ha sido eliminada. Si usted necesita tomar decisiones afectadas por la versión AST, use sys.version_info para tomar la decisión.

  • El código que solía solucionar el hecho de que el módulo threading utilizaba funciones de fábrica mediante la subclase de las clases privadas tendrá que cambiar a la subclase de las clases ahora públicas.

  • La indocumentada maquinaria de depuración en el módulo threading ha sido eliminada, simplificando el código. Esto no debería tener efecto en el código de producción, pero se menciona aquí en caso de que algún framework de depuración de aplicaciones interactúe con el (bpo-13550).

Portando código C

  • En el curso de los cambios en la API del búfer, se eliminó el miembro smalltable no documentado de la estructura Py_buffer y se cambió el diseño del PyMemoryViewObject.

    Todas las extensiones que quedan en las partes relevantes de memoryobject.h o object.h deben ser reconstruídas.

  • Debido a PEP 393, el tipo Py_UNICODE y todas las funciones que lo utilicen han quedado obsoletas (pero seguirán estando disponibles por al menos 5 años). Si usted estuvo usando APIS Unicode de bajo nivel para construir y acceder a objetos unicode, y desea beneficiarse de la reducción de huella de memoria proporcionada por PEP 393, usted debe convertir su código al nuevo Unicode API.

    Sin embargo, si sólo ha estado usando funciones de alto nivel como PyUnicode_Concat(), PyUnicode_Join() o PyUnicode_FromFormat(), automáticamente su código se beneficiará de las nuevas representaciones unicode.

  • PyImport_GetMagicNumber() ahora retorna -1 en caso de falla.

  • Como valor negativo para el argumento level de la función __import__() ya no es válido, y lo mismo ahora es válido para la función PyImport_ImportModuleLevel(). Esto también significa que el valor de level usado por la función PyImport_ImportModuleEx() ahora es 0 en vez de -1.

Construyendo extensiones C

  • Se ha reducido el rango de nombres de archivo posibles para las extensiones C. Muy raramente se han suprimido las ortografías utilizadas: en POSIX, los archivos denominados xxxmodule.so, xxxmodule.abi3.so y xxxmodule.cpython-*.so ya no se reconocen como la implementación del módulo xxx. Si ha estado generando estos archivos, tiene que cambiar a las otras ortografías (es decir, eliminar la cadena de caracteres módulo de los nombres de archivo).

    (implementado en bpo-14040.)

Cambios en el conmutador de línea de comandos

  • Se han quitado el indicador de línea de comandos -Q y los artefactos relacionados. La comprobación de código sys.flags.division_warning tendrá que actualizar.

    (bpo-10998, contribución de Éric Araujo.)

  • Cuando se inicia python con -S, import site ya no agregará las rutas específicas de sitio al módulo de búsqueda de rutas. En las versiones anteriores si lo hacía.

    (bpo-11591, contribución de Carl Meyer con ediciones de Éric Araujo.)