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:

* Nueva expresión "yield from" para delegación de generadores.

* La sintaxis "u'unicode'" se acepta de nuevo para los objetos "str".

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:

* Se reformula la Jerarquía de excepción I/O .

Mejoras de implementación:

* Se reescribe Maquinaria de importación con base en "importlib".

* cadenas de caracteres unicode más compactas.

* diccionarios de atributos más compactos.

Módulos de biblioteca con mejoras significativas:

* Acelerador de C para el módulo decimal .

* Mejor gestión de *unicode* en el módulo email (*provisional*).

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:

* "BlockingIOError"

* "ChildProcessError"

* "ConnectionError"

* "FileExistsError"

* "FileNotFoundError"

* "InterruptedError"

* "IsADirectoryError"

* "NotADirectoryError"

* "PermissionError"

* "ProcessLookupError"

* "TimeoutError"

Y el mismo "ConnectionError" tiene subclases más detalladas:

* "BrokenPipeError"

* "ConnectionAbortedError"

* "ConnectionRefusedError"

* "ConnectionResetError"

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.

* La clase "abc.abstractproperty" ha quedado obsoleta, en su lugar use
  la clase "property" con "abc.abstractmethod()".

* La clase "abc.abstractclassmethod" ha quedado obsoleta. En su lugar
  use el método "classmethod" with "abc.abstractmethod()".

* "abc.abstractstaticmethod" ha quedado obsoleta, use "staticmethod"
  with "abc.abstractmethod()".

(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
--------

* Las comparaciones de igualdad entre instancias conscientes e
  ingenuas "datetime" ahora retornan "False" en lugar de generar
  "TypeError" (bpo-15006).

* Nuevo método "datetime.datetime.timestamp()": Retorna la marca de
  tiempo POSIX correspondiente a la instancia "datetime".

* El método "datetime.datetime.strftime()" admite el formato de años
  anteriores a 1000.

* Ahora se puede llamar al método "datetime.datetime.astimezone()" sin
  argumentos para convertir la instancia datetime en la zona horaria
  del sistema.


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"     |
     +---------------------+------------------+---------------------------+

* In the context templates ("DefaultContext", "BasicContext" and
  "ExtendedContext") the magnitude of "Emax" and "Emin" has changed to
  "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:

* "format_datetime()": dado un "datetime", produce una cadena
  formateada para su uso en un encabezado de correo electrónico.

* "email.utils.parsedate_to_datetime()": dada una cadena de fecha de
  un encabezado de correo electrónico, conviértela en un
  "datetime.datetime", o un ingenuo "datetime.datetime" si el
  desplazamiento es "-0000".

* "localtime()": Sin argumento, retorna la hora local actual como un
  reconocimiento "datetime" utilizando el local "timezone".  Teniendo
  en cuenta "datetime", lo convierte en un "datetime" con el valor
  local "timezone".


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).

  * El módulo "os" tiene una nueva función "fwalk()" similar a
    "walk()" excepto que también incluye descriptores de archivos que
    se refieren a los directorios visitados. Esto es especialmente
    útil para prevenir las carreras de enlaces simbólicos.

  * Las siguientes funciones tienen las nuevas opciones *dir_fd*
    (rutas relativas a descriptores de archivos) y/o *follow_symlinks*
    (not following symlinks): "access()", "chflags()", "chmod()",
    "chown()", "link()", "lstat()", "mkdir()", "mkfifo()", "mknod()",
    "open()", "readlink()", "remove()", "rename()", "replace()",
    "rmdir()", "stat()", "symlink()", "unlink()", "utime()". El
    soporte de la plataforma para usar éstos parámetros puede
    verificarse a través de los conjuntos "os.supports_dir_fd" and
    "os.supports_follows_symlinks".

  * Las siguientes funciones ahora admiten un descriptor de archivos
    para su argumento de ruta: "chdir()", "chmod()", "chown()",
    "execve()", "listdir()", "pathconf()", "exists()", "stat()",
    "statvfs()", "utime()". El soporte de la plataforma para ésto
    puede ser verificado a través del conjunto "os.supports_fd".

* "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. )

* Nuevas funciones para admitir atributos extendidos de Linux.
  (bpo-12720): "getxattr()", "listxattr()", "removexattr()",
  "setxattr()".

* Nueva interfaz para el planificador. Estas funciones controlan como
  el sistema operativo le asigna tiempo de CPU a un proceso. Nuevas
  funciones: "sched_get_priority_max()", "sched_get_priority_min()",
  "sched_getaffinity()", "sched_getparam()", "sched_getscheduler()",
  "sched_rr_get_interval()", "sched_setaffinity()",
  "sched_setparam()", "sched_setscheduler()", "sched_yield()",

* Nuevas funciones para controlar el sistema de archivos:

  * "posix_fadvise()": Anuncia una intención de acceder a los datos en
    un patrón específico, permitiendo al kernel hacer optimizaciones.

  * "posix_fallocate()": Garantiza que se asigne el espacio suficiente
    a un archivo.

  * "sync()": Fuerza la escritura de cualquier cosa en el disco.

* Nuevas funciones posix adicionales:

  * "lockf()": Aplicar, probar o eliminar un bloqueo POSIX en un
    descriptor de archivo abierto.

  * "pread()": Leer desde un descriptor de archivo en un
    desplazamiento, el desplazamiento del archivo permanece sin
    cambios.

  * "pwrite()": Escribe en un descriptor de archivo desde un
    desplazamiento, dejando el desplazamiento del archivo sin cambios.

  * "readv()": Leer desde el descriptor de un archivo en varios
    búferes editables.

  * "truncate()": Truncar el archivo correspondiente a *path*, para
    que tenga como máximo *length* *bytes* de tamaño.

  * "waitid()": Espera que se completen uno o más procesos
    secundarios.

  * "writev()": Escribir los contenidos de *buffers* a un archivo
    descriptor, donde *buffers* es una secuencia arbitraria de
    *buffers*.

  * "getgrouplist()" (bpo-9344): Retorna una lista de ids de grupo al
    que pertenece el usuario especificado.

* "times()" and "uname()": El tipo de retorno cambió de tupla a un
  objeto tipo tupla con atributos con nombre.

* Varias plataformas admiten constantes adicionales para la función
  "lseek()", tal como "os.SEEK_HOLE" y "os.SEEK_DATA".

* Nuevas constantes "RTLD_LAZY", "RTLD_NOW", "RTLD_GLOBAL",
  "RTLD_LOCAL", "RTLD_NODELETE", "RTLD_NOLOAD", and "RTLD_DEEPBIND"
  están disponibles en plataformas que las soporten. Éstas son para
  uso con la función "sys.setdlopenflags()", y reemplazan las
  constantes similares definidas en "ctypes" and "DLFCN".
  (Contribución de Victor Stinner en bpo-13226.)

* "os.symlink()" ahora acepta (e ignora) el argumento de palabra clave
  "target_is_directory" en plataformas diferentes a windows, para
  facilitar el soporte multiplataforma.


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:

  * "pthread_sigmask()": busca y/o cambia la máscara de señal del hilo
    de llamada (Contribución de Jean-Paul Calderone in bpo-8407);

  * "pthread_kill()": Envía una señal a un hilo;

  * "sigpending()": Examina funciones pendientes;

  * "sigwait()": Espera una señal;

  * "sigwaitinfo()": Espera una señal, retornando información
    detallada sobre ella;

  * "sigtimedwait()": Es similar a "sigwaitinfo()" pero con un tiempo
    de espera.

* 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
------

* La clase "socket" ahora expone métodos adicionales para procesar
  datos auxiliares cuando sean compatibles con la plataforma
  subyacente:

  * "sendmsg()"

  * "recvmsg()"

  * "recvmsg_into()"

  (Contribución de David Watson en bpo-6560, basado en una revisión
  anterior de Heiko Wundram)

* La clase "socket" ahora admite la familia del protocolo PF_CAN
  (https://en.wikipedia.org/wiki/Socketcan), en Linux
  (https://lwn.net/Articles/253425).

  (Contribución de Matthias Fuchs, actualizado por Tiago Gonçalves en
  bpo-10141.)

* La clase "socket" ahora admite la familia de protocolos PF_RDS
  (https://en.wikipedia.org/wiki/Reliable_Datagram_Sockets y
  https://oss.oracle.com/projects/rds).

* La clase "socket" ahora admite la familia del protocolo "PF_SYSTEM"
  en OS X. (Contribución de Michael Goderbauer en bpo-13777.)

* La nueva función "sethostname()" permite establecer el nombre de
  host en sistemas Unix si el proceso de llamada tiene suficientes
  privilegios. (Aportado por Ross Lagerwall en bpo-10866.)


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:

* Las funciones "clock_getres()", "clock_gettime()" y
  "clock_settime()" con constantes "CLOCK_*xxx*" (Contribución de
  Victor Stinner in bpo-10278.)

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:

* Nueva función relacionada con **PEP 3118**:

  * "PyMemoryView_FromMemory()"

* **PEP 393** Agregó nuevos tipos *unicode*, macros y funciones:

  * API de alto nivel:

    * "PyUnicode_CopyCharacters()"

    * "PyUnicode_FindChar()"

    * "PyUnicode_GetLength()", "PyUnicode_GET_LENGTH"

    * "PyUnicode_New()"

    * "PyUnicode_Substring()"

    * "PyUnicode_ReadChar()", "PyUnicode_WriteChar()"

  * API de bajo nivel:

    * Tipos "Py_UCS1", "Py_UCS2", "Py_UCS4"

    * Estructuras "PyASCIIObject" y "PyCompactUnicodeObject"

    * "PyUnicode_READY"

    * "PyUnicode_FromKindAndData()"

    * "PyUnicode_AsUCS4()", "PyUnicode_AsUCS4Copy()"

    * "PyUnicode_DATA", "PyUnicode_1BYTE_DATA",
      "PyUnicode_2BYTE_DATA", "PyUnicode_4BYTE_DATA"

    * "PyUnicode_KIND" con "PyUnicode_Kind" enum:
      "PyUnicode_WCHAR_KIND", "PyUnicode_1BYTE_KIND",
      "PyUnicode_2BYTE_KIND", "PyUnicode_4BYTE_KIND"

    * "PyUnicode_READ", "PyUnicode_READ_CHAR", "PyUnicode_WRITE"

    * "PyUnicode_MAX_CHAR_VALUE"

* "PyArg_ParseTuple" ahora acepta un "bytearray" para el formato "c"
  (bpo-12380).


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
-------------------------------------------------

* Pasar una cadena no vacía a "object.__format__()" está
  descontinuado, y producirá un "TypeError" en Python 3.4 (bpo-9856).

* El códec "unicode_internal" quedó obsoleto a causa del **PEP 393**,
  use UTF-8, UTF-16 ("utf-16-le" o "utf-16-be"), o UTF-32 ("utf-32-le"
  or "utf-32-be")

* "ftplib.FTP.nlst()" y "ftplib.FTP.dir()": use "ftplib.FTP.mlsd()"

* "platform.popen()": use el módulo "subprocess". Verifique
  especialmente la sección Cómo reemplazar anteriores funciones con el
  módulo subprocess (bpo-11377).

* bpo-13374: La API de *bytes* de Windows ha sido descontinuada en el
  módulo "os". Use nombres de archivo *Unicode*, en vez de nombres de
  archivo de bytes, para no depender más de la página de códigos ANSI
  y admitir cualquier nombre de archivo.

* bpo-13988: El módulo "xml.etree.cElementTree" ha quedado obsoleto.
  El acelerador se utiliza automáticamente siempre que esté
  disponible.

* El comportamiento de "time.clock()" depende de la plataforma:
  utilice la nueva función "time.perf_counter()" o
  "time.process_time()" en su lugar, dependiendo de sus
  requerimientos, para tener un comportamiento bien definido.

* La función "os.stat_float_times()" ha quedado obsoleta.

* "abc" module:

  * La clase "abc.abstractproperty" ha quedado obsoleta, en su lugar
    use la clase "property" con "abc.abstractmethod()".

  * La clase "abc.abstractclassmethod" ha quedado obsoleta. En su
    lugar use el método "classmethod" with "abc.abstractmethod()".

  * "abc.abstractstaticmethod" ha quedado obsoleta, use "staticmethod"
    with "abc.abstractmethod()".

* paquete "importlib":

  * "importlib.abc.SourceLoader.path_mtime()" ha quedado obsoleto, a
    favor de "importlib.abc.SourceLoader.path_stats()" ya que los
    archivos de código de *bytes* ahora almacenan tanto la hora de
    modificación como el tamaño del archivo fuente desde el cual se
    compiló el archivo de código de bytes.


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*:

* "PyUnicode_FromUnicode": use "PyUnicode_FromWideChar()" o
  "PyUnicode_FromKindAndData()"

* "PyUnicode_AS_UNICODE", "PyUnicode_AsUnicode()",
  "PyUnicode_AsUnicodeAndSize()": use "PyUnicode_AsWideCharString()"

* "PyUnicode_AS_DATA": use "PyUnicode_DATA" con "PyUnicode_READ" y
  "PyUnicode_WRITE"

* "PyUnicode_GET_SIZE", "PyUnicode_GetSize()": use
  "PyUnicode_GET_LENGTH" o "PyUnicode_GetLength()"

* "PyUnicode_GET_DATA_SIZE": use "PyUnicode_GET_LENGTH(str) *
  PyUnicode_KIND(str)" (sólo funciona en cadenas listas)

* "PyUnicode_AsUnicodeCopy()": use "PyUnicode_AsUCS4Copy()" o
  "PyUnicode_AsWideCharString()"

* "PyUnicode_GetMax()"

Funciones y macros que manipulen cadenas de caracteres Py_UNICODE*:

* "Py_UNICODE_strlen": use "PyUnicode_GetLength()" o
  "PyUnicode_GET_LENGTH"

* "Py_UNICODE_strcat": use "PyUnicode_CopyCharacters()" o
  "PyUnicode_FromFormat()"

* "Py_UNICODE_strcpy", "Py_UNICODE_strncpy", "Py_UNICODE_COPY": use
  "PyUnicode_CopyCharacters()" o "PyUnicode_Substring()"

* "Py_UNICODE_strcmp()": use "PyUnicode_Compare()"

* "Py_UNICODE_strncmp()": use "PyUnicode_Tailmatch()"

* "Py_UNICODE_strchr()", "Py_UNICODE_strrchr()": use
  "PyUnicode_FindChar()"

* "Py_UNICODE_FILL()": use "PyUnicode_Fill()"

* "Py_UNICODE_MATCH"

Codificadores:

* "PyUnicode_Encode()": use "PyUnicode_AsEncodedObject()"

* "PyUnicode_EncodeUTF7()"

* "PyUnicode_EncodeUTF8()": use "PyUnicode_AsUTF8()" o
  "PyUnicode_AsUTF8String()"

* "PyUnicode_EncodeUTF32()"

* "PyUnicode_EncodeUTF16()"

* "PyUnicode_EncodeUnicodeEscape()" use
  "PyUnicode_AsUnicodeEscapeString()"

* "PyUnicode_EncodeRawUnicodeEscape()" use
  "PyUnicode_AsRawUnicodeEscapeString()"

* "PyUnicode_EncodeLatin1()": use "PyUnicode_AsLatin1String()"

* "PyUnicode_EncodeASCII()": use "PyUnicode_AsASCIIString()"

* "PyUnicode_EncodeCharmap()"

* "PyUnicode_TranslateCharmap()"

* "PyUnicode_EncodeMBCS()": use "PyUnicode_AsMBCSString()" o
  "PyUnicode_EncodeCodePage()" (con "CP_ACP" code_page)

* "PyUnicode_EncodeDecimal()", "PyUnicode_TransformDecimalToASCII()"


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.)
