Qué hay de nuevo en Python 2.7
******************************

Autor:
   A.M. Kuchling (amk en amk.ca)

Este articulo explica las nuevas características en Python 2.7.
Python 2.7 fue publicado el 3 de Julio de 2010.

El manejo numérico ha sido mejorado en muchas formas, tanto para los
números de punto flotante como para la clase "Decimal". Hay algunas
adiciones útiles a la biblioteca estándar, como una gran mejora al
modulo "unittest", el modulo "argparse" para analizar las opciones de
la línea de comandos, adecuando las clases "OrderedDict" y "Counter"
en el modulo "collections", y muchas otras mejoras.

Python 2.7 esta previsto que sea el ultimo lanzamiento de la serie
2.x, así que hemos trabajado para que sea una versión a largo plazo.
Para ayudar con la migración a Python 3, se han incluido varias
características nuevas de la serie Python 3.x en 2.7.

Este articulo no intenta proporcionar una especificación completa de
las nuevas características, sino que proporciona una visión general
conveniente.  Para obtener mas información, debería consultar la
documentación de Python 2.7 en https://docs.python.org. Si desea
comprender la justificación para el diseño y la implementación,
consultar el PEP para una nueva característica particular o el error
en el que se discutió un cambio en https://bugs.python.org.  Siempre
que sea posible, "Que hay de nuevo en Python" enlaza el elemento
error/parche para cada cambio.


El futuro de Python 2.x
=======================

Python 2.7 es el último lanzamiento importante de la serie 2.x, ya que
los mantenedores de Python han cambiado el enfoque de sus esfuerzos en
el desarrollo de nuevas características para la serie de Python 3.x.
Esto significa que mientras Python 2 continúe recibiendo corrección de
errores, y sea actualizado para construir correctamente sobre nuevo
hardware y versiones de sistemas operativos compatibles, no habrá
nuevas versiones completas de funciones para el idioma o la biblioteca
estándar.

Sin embargo, si bien existe un gran subconjunto común entre Python 2.7
y Python 3, y muchos de los cambios involucrados en la migración a ese
subconjunto común, o directamente a Python 3, se pueden automatizar de
manera segura, algunos otros cambios (en particular los asociados con
el manejo de Unicode) puede requerir una consideración cuidadosa, y
preferiblemente conjuntos de pruebas de regresión automatizada
robustos, para migrar de manera efectiva.

Esto significa que Python 2.7 permanecerá en su lugar durante un largo
tiempo, proporcionando una plataforma base estable y compatible para
sistemas de producción que aún no se han adaptado a Python 3. La
expectativa completa del ciclo de vida de la versión de Python 2.7
esta detallada en **PEP 373**.

Algunas consecuencias clave de la importancia a largo plazo de 2.7
son:

* Como se señalo anteriormente, la versión 2.7 tiene un período de
  mantenimiento mucho más largo en comparación con las versiones
  anteriores 2.x. Actualmente se espera que Python 2.7 siga siendo
  compatible con el equipo de desarrollo central (recibiendo
  actualizaciones de seguridad y otras correcciones de errores) al
  menos hasta 2020 (10 años después de su lanzamiento inicial,
  comparado con el típico periodo de mantenimiento de 18--24 meses).

* A medida que la biblioteca estándar de Python envejece, hacer un uso
  eficaz del índice de paquetes de Python (ya sea directamente o a
  través de un distribuidor) se vuelve mas importante para los
  usuarios de Python 2. Además de una amplia variedad de paquetes de
  terceros para diversas tareas, los paquetes disponibles incluyen
  *backports* de nuevos módulos y características de la biblioteca
  estándar de Python 3 que son compatibles con Python 2, así como
  varias herramientas y librerías que pueden hacer mas fácil la
  migración a Python 3. La Guía de usuario de paquetes de Python
  proporciona un información sobre como descargar e instalar software
  desde el índice de paquetes de Python.

* Aunque el enfoque preferido para mejorar Python 2 es ahora la
  publicación de nuevos paquetes en el índice de paquetes de Python,
  este enfoque no necesariamente funciona en todos los casos,
  especialmente aquellos relacionados a la seguridad de la red. En
  casos excepcionales que no puedan ser manejados adecuadamente
  mediante la publicación de nuevos paquetes o actualizaciones en
  PyPI, el proceso de propuestas de mejoras de Python podría ser usado
  para crear el caso para añadir nuevas funciones a la librería
  estándar de Python 2. Dichas adiciones, y las versiones de
  mantenimiento donde fueron agregadas, se observaran en la sección
  Nuevas funciones añadidas a las versiones de mantenimiento de Python
  2.7 mas abajo.

Para los proyectos que deseen migrar de Python 2 a Python 3, o para
los desarrolladores de *frameworks* y libreras que deseen dar soporte
a usuarios en Python 2 y Python 3, hay una variedad de herramientas y
guías disponibles para ayudarles a decidir sobre un enfoque adecuado y
manejar algunos de los detalles técnicos involucrados. El punto de
partida recomendado es la guía HOWTO How to port Python 2 Code to
Python 3.


Cambios en el manejo de las advertencias de desuso
==================================================

Para Python 2.7, se tomo la decisión de silenciar las advertencias
solo de interés para los desarrolladores de manera predeterminada.
"DeprecationWarning`y sus descendientes son ahora ignoradas a menos
que se solicite lo contrario, impidiendo a los usuarios estar viendo
las advertencias disparadas por una aplicación. Este cambio se realizo
en la rama que se convirtió en Python 3.2. (Discutido en stdlib-sig y
llevado a cabo en :issue:`7319").

En versiones previas, los mensajes "DeprecationWarning" estaban
habilitados de manera predeterminada, proporcionando a los
desarrolladores de Python una indicación clara de donde podría
romperse su código en una futura versión principal de Python.

Sin embargo, cada vez hay más usuarios de aplicaciones basadas en
Python que no están directamente involucrados en el desarrollo de esas
aplicaciones.  Los mensajes "DeprecationWarning" son irrelevantes para
estos usuarios, hacen que se preocupen por una aplicación que
realmente está funcionando correctamente y sobrecargando a los
desarrolladores de aplicaciones con responder a estas preocupaciones.

Puede volver a habilitar la visualización de los mensajes
"DeprecationWarning" ejecutando Python con el modificador "-Wdefault"
(forma corta: "-Wd"), o estableciendo la variable de entorno
"PYTHONWARNINGS" en ""default"" (o ""d"") antes de ejecutar Python.
El código Python también puede volver a habilitarlos llamando a
"warnings.simplefilter('default')".

El módulo "unittest" también vuelve a instalar automáticamente las
advertencias de desuso al ejecutar pruebas.


Características de Python 3.1
=============================

Al igual que Python 2.6 incorporó características de Python 3.0, la
versión 2.7 incorpora algunas de las nuevas características de Python
3.1.  La serie 2.x continúa proporcionando herramientas para migrar a
la serie 3.x.

Una lista parcial de características 3.1 que se retro importaron a
2.7:

* La sintaxis para establecer literales ("{1,2,3}" es un conjunto
  mutable).

* Diccionario y establecimiento de compresiones ("{i: i*2 for i in
  range(3)}").

* Múltiples administradores de contexto en una sola declaración
  "with".

* Una nueva versión para la librería "io", rescrito en C para un mejor
  desempeño.

* El tipo de ordenador de diccionario descrito en PEP 372: Adición de
  un diccionario ordenado a las colecciones.

* El nuevo especificador de formato "","" descrito en PEP 378:
  Especificador de formato para separador de miles.

* El objeto "memoryview".

* Un pequeño subconjunto del modulo "importlib", descrito abajo.

* La "repr()" de un flotante "x" es más corto en muchos casos: ahora
  se basa en la cadena decimal más corta que se garantiza que redondea
  a "x". Como en versiones anteriores de Python, se garantiza que
  "float(repr(x))" retorne "x".

* Las conversiones flotante a cadena y cadena a flotante se redondean
  correctamente. La función "round()" también ahora se redondea
  correctamente.

* El tipo "PyCapsule", utilizado para proporcionar una API de C para
  módulos de extensión.

* La función de API de C "PyLong_AsLongAndOverflow()".

Otras nuevas advertencias en modo Python3 incluyen:

* "operator.isCallable()" y "operator.sequenceIncludes()", que no se
  admiten en 3.x, ahora activan advertencias.

* El modificador "-3" ahora habilita automáticamente el modificador
  "-Qwarn" que provoca advertencias sobre el uso de la división
  clásica con enteros y enteros largos.


PEP 372: Adición de un diccionario ordenado a las colecciones
=============================================================

Los diccionarios de python normales recorren en iteración los pares
clave/valor en un orden arbitrario. A lo largo de los años, varios
autores han escrito implementaciones alternativas que recuerdan el
orden en que se insertaron originalmente las claves.  Basado en las
experiencias de esas implementaciones, 2.7 presenta una nueva clase
"OrderedDict" en el módulo "collections".

La API "OrderedDict" proporciona la misma interfaz que los
diccionarios normales, pero recorre en iteración las claves y los
valores en un orden garantizado en función de cuándo se insertó una
clave por primera vez:

   >>> from collections import OrderedDict
   >>> d = OrderedDict([('first', 1),
   ...                  ('second', 2),
   ...                  ('third', 3)])
   >>> d.items()
   [('first', 1), ('second', 2), ('third', 3)]

Si una nueva entrada sobrescribe una entrada existente, la posición de
inserción original no se modifica:

   >>> d['second'] = 4
   >>> d.items()
   [('first', 1), ('second', 4), ('third', 3)]

Borrando una entrada y luego reinsertándola, moverá la misma al final:

   >>> del d['second']
   >>> d['second'] = 5
   >>> d.items()
   [('first', 1), ('third', 3), ('second', 5)]

El método "popitem()" tiene un argumento *last* opcional que por
defecto esta en "True" (verdadero). Si *last* es verdadero, la ultima
llave ingresada es regresada y eliminada; si es falso, se selecciona
la llave más antigua:

   >>> od = OrderedDict([(x,0) for x in range(20)])
   >>> od.popitem()
   (19, 0)
   >>> od.popitem()
   (18, 0)
   >>> od.popitem(last=False)
   (0, 0)
   >>> od.popitem(last=False)
   (1, 0)

La comparación de dos diccionarios ordenados comprueba tanto las
claves como los valores, y requiere que el orden de inserción sea el
mismo:

   >>> od1 = OrderedDict([('first', 1),
   ...                    ('second', 2),
   ...                    ('third', 3)])
   >>> od2 = OrderedDict([('third', 3),
   ...                    ('first', 1),
   ...                    ('second', 2)])
   >>> od1 == od2
   False
   >>> # Move 'third' key to the end
   >>> del od2['third']; od2['third'] = 3
   >>> od1 == od2
   True

Comparando a un "OrderedDict" con un diccionario normal ignora el
orden de inserción y simplemente compara las llaves y los valores.

¿Cómo funciona "OrderedDict"? Mantiene una lista doblemente enlazada
de claves y añade nuevas claves a la lista a medida que se insertan.
Un diccionario secundario asigna las claves a su nodo de lista
correspondiente, por lo que la eliminación no tiene que recorrer toda
la lista enlazada y, por lo tanto, sigue siendo *O*(1).

La biblioteca estándar ahora admite el uso de diccionarios ordenados
en varios módulos.

* El módulo "ConfigParser" los utiliza de forma predeterminada, lo que
  significa que ahora los archivos de configuración se pueden leer,
  modificar y luego volver a escribir en su orden original.

* El método "_asdict()" para "collections.namedtuple()" ahora devuelve
  un diccionario ordenado con los valores que aparecen en el mismo
  orden que los índices de tupla subyacentes.

* El constructor de clase "JSONDecoder" del módulo "json" se amplió
  con un parámetro *object_pairs_hook* para permitir que el
  decodificador construya instancias "OrderedDict". También se agregó
  soporte para herramientas de terceros como PyYAML.

Ver también:

  **PEP 372** - Adición de un diccionario ordenado a las *collections*
     PEP escrito por Armin Ronacher y Raymond Hettinger; implementado
     por Raymond Hettinger.


PEP 378: Especificador de formato para separador de miles
=========================================================

Para que la salida del programa sea más legible, puede ser útil
agregar separadores a números grandes, representándolos como
18,446,744,073,709,551,616 en lugar de 18446744073709551616.

La solución totalmente general para hacer esto es el módulo "locale",
que puede utilizar diferentes separadores ("," en América del Norte,
"." en Europa) y diferentes tamaños de agrupación, pero "locale" es
complicado de usar y no es adecuado para aplicaciones multiproceso
donde diferentes hilos están produciendo resultados para diferentes
configuraciones regionales.

Por lo tanto, se ha añadido un mecanismo simple de agrupación de comas
al mini-lenguaje utilizado por el método "str.format()".  Al dar
formato a un número de punto flotante, simplemente incluya una coma
entre el ancho y la precisión:

   >>> '{:20,.2f}'.format(18446744073709551616.0)
   '18,446,744,073,709,551,616.00'

Al dar formato a un entero, incluya la coma después del ancho:

>>> '{:20,d}'.format(18446744073709551616)
'18,446,744,073,709,551,616'

Este mecanismo no es adaptable en absoluto; Las comas siempre se
utilizan como separador y la agrupación siempre está en grupos de tres
dígitos.  El mecanismo de formato de coma no es tan general como el
módulo "locale", pero es más fácil de usar.

Ver también:

  **PEP 378** - Especificador de formato para separador de miles
     PEP escrito por Raymond Hettinger; implementado por Eric Smith.


PEP 389: El módulo argparse para el análisis de líneas de comando
=================================================================

El módulo "argparse" para analizar argumentos de línea de comandos se
agregó como un reemplazo más potente para el módulo "optparse".

Esto significa que Python ahora admite tres módulos diferentes para
analizar argumentos de línea de comandos: "getopt", "optparse" y
"argparse". El módulo "getopt" se parece mucho a la función "getopt()"
de la biblioteca C, por lo que sigue siendo útil si está escribiendo
un prototipo de Python que eventualmente se reescribirá en C.
"optparse" se vuelve redundante, pero no hay planes de eliminarlo
porque hay muchos scripts que aún lo usan y no hay una forma
automatizada de actualizar estos scripts. (Se discutió hacer que la
API "argparse" sea consistente con la interfaz de "optparse", pero se
rechazó por ser demasiado desordenada y difícil).

En resumen, si estás escribiendo un nuevo script y no necesitas
preocuparte por la compatibilidad con versiones anteriores de Python,
usa "argparse" en lugar de "optparse".

Este es un ejemplo:

   import argparse

   parser = argparse.ArgumentParser(description='Command-line example.')

   # Add optional switches
   parser.add_argument('-v', action='store_true', dest='is_verbose',
                       help='produce verbose output')
   parser.add_argument('-o', action='store', dest='output',
                       metavar='FILE',
                       help='direct output to FILE instead of stdout')
   parser.add_argument('-C', action='store', type=int, dest='context',
                       metavar='NUM', default=0,
                       help='display NUM lines of added context')

   # Allow any number of additional arguments.
   parser.add_argument(nargs='*', action='store', dest='inputs',
                       help='input filenames (default is stdin)')

   args = parser.parse_args()
   print args.__dict__

A menos que lo reemplace, los modificadores "-h" y "--help" se agregan
automáticamente, y producen una salida con formato ordenado:

   -> ./python.exe argparse-example.py --help
   usage: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [inputs [inputs ...]]

   Command-line example.

   positional arguments:
     inputs      input filenames (default is stdin)

   optional arguments:
     -h, --help  show this help message and exit
     -v          produce verbose output
     -o FILE     direct output to FILE instead of stdout
     -C NUM      display NUM lines of added context

Al igual que con "optparse", los modificadores y argumentos de línea
de comandos se retornan como un objeto con atributos denominados por
los parámetros *dest*:

   -> ./python.exe argparse-example.py -v
   {'output': None,
    'is_verbose': True,
    'context': 0,
    'inputs': []}

   -> ./python.exe argparse-example.py -v -o /tmp/output -C 4 file1 file2
   {'output': '/tmp/output',
    'is_verbose': True,
    'context': 4,
    'inputs': ['file1', 'file2']}

"argparse" tiene una validación mucho más fantasiosa que "optparse";
puede especificar un número exacto de argumentos como un entero, 0 o
más argumentos pasando "'*'", 1 o más pasando "'+'", o un argumento
opcional con "'?'".  Un analizador de nivel superior puede contener
sub analizadores para definir subcomandos que tienen diferentes
conjuntos de modificadores, como en "svn commit", "svn checkout", etc.
Puede especificar el tipo de un argumento como "FileType", que abrirá
automáticamente los archivos y entiende que "'-'" significa entrada o
salida estándar.

Ver también:

  "argparse" documentación
     La página de documentación del módulo argparse.

  Migrating optparse code to argparse
     Parte de la documentación de Python, que describe cómo convertir
     código que usa "optparse".

  **PEP 389** - argparse - Nuevo módulo de análisis de línea de
  comandos
     PEP escrito e implementado por Steven Bethard.


PEP 391: Configuración basada en diccionarios para el registro
==============================================================

El módulo "logging" es muy flexible; las aplicaciones pueden definir
un árbol de subsistemas de registro, y cada registrador de este árbol
puede filtrar ciertos mensajes, formatearlos de forma diferente y
dirigir mensajes a un número variable de controladores.

Toda esta flexibilidad puede requerir mucha configuración. Puedes
escribir instrucciones Python para crear objetos y establecer sus
propiedades, pero una configuración compleja requiere un código
extenso pero aburrido. "logging" también admite una función
"fileConfig()" que analiza un archivo, pero el formato de archivo no
admite la configuración de filtros y es más complicado generarlo
mediante programación.

Python 2.7 agrega una función "dictConfig()" que utiliza un
diccionario para configurar el registro. Hay muchas maneras de
producir un diccionario a partir de diferentes fuentes: construir uno
con código; analizar un archivo que contenga JSON; o utilizar una
biblioteca de análisis de YAML si hay una instalada. Para obtener más
información, consulte Funciones de configuración.

En el ejemplo siguiente se configuran dos registradores, el
registrador raíz y un registrador denominado "network".  Los mensajes
enviados al registrador raíz se enviarán al registro del sistema
mediante el protocolo syslog, y los mensajes al registrador de la
"network" se escribirán en un archivo "network.log" que se rotará una
vez que el registro alcance 1MB.

   import logging
   import logging.config

   configdict = {
    'version': 1,    # Configuration schema in use; must be 1 for now
    'formatters': {
        'standard': {
            'format': ('%(asctime)s %(name)-15s '
                       '%(levelname)-8s %(message)s')}},

    'handlers': {'netlog': {'backupCount': 10,
                        'class': 'logging.handlers.RotatingFileHandler',
                        'filename': '/logs/network.log',
                        'formatter': 'standard',
                        'level': 'INFO',
                        'maxBytes': 1000000},
                 'syslog': {'class': 'logging.handlers.SysLogHandler',
                            'formatter': 'standard',
                            'level': 'ERROR'}},

    # Specify all the subordinate loggers
    'loggers': {
                'network': {
                            'handlers': ['netlog']
                }
    },
    # Specify properties of the root logger
    'root': {
             'handlers': ['syslog']
    },
   }

   # Set up configuration
   logging.config.dictConfig(configdict)

   # As an example, log two error messages
   logger = logging.getLogger('/')
   logger.error('Database not found')

   netlogger = logging.getLogger('network')
   netlogger.error('Connection failed')

Tres mejoras más pequeñas en el módulo "logging", todas implementadas
por Vinay Sajip, son:

* La clase "SysLogHandler" ahora admite syslogging a través de TCP.
  El constructor tiene un parámetro *socktype* que proporciona el tipo
  de socket que se va a usar, ya sea "socket.SOCK_DGRAM" para UDP o
  "socket.SOCK_STREAM" para TCP.  El protocolo predeterminado sigue
  siendo UDP.

* Las instancias "Logger" ganaron un método "getChild()" que recupera
  un registrador descendiente mediante una ruta de acceso relativa.
  Por ejemplo, una vez que se recupera un registrador haciendo "log =
  getLogger('app')", llamando "log.getChild('network.listen')" es
  equivalente a "getLogger('app.network.listen')".

* La clase "LoggerAdapter" obtuvo un método "isEnabledFor()" que toma
  un *level* y devuelve si el registrador subyacente procesaría un
  mensaje de ese nivel de importancia.

Ver también:

  **PEP 391** - Configuración basada en diccionarios para el registro
     PEP escrito e implementado por Vinay Sajip.


PEP 3106: Vistas de diccionario
===============================

Los métodos de diccionarios "keys()", "values()" y "items()" son
diferentes en Python 3.x. Ellos regresan un objeto llamado *view* en
lugar de una lista completamente materializada.

No es posible cambiar los valores de retorno de "keys()", "values()" y
"items()" en Python 2.7 porque demasiado código podría fallar. En su
lugar, se agregaron las versiones 3.x con los nuevos nombres
"viewkeys()", "viewvalues()" y "viewitems()".

   >>> d = dict((i*10, chr(65+i)) para i en rango(26))
   >>> d
   {0: 'A', 130: 'N', 10: 'B', 140: 'O', 20: ..., 250: 'Z'}
   >>> d.viewkeys()
   dict_keys([0, 130, 10, 140, 20, 150, 30, ..., 250])

Las vistas se pueden iterar, pero las vistas de elementos y claves
también se comportan como conjuntos. El operador "&" realiza la
intersección y "|" realiza una unión:

   >>> d1 = dict((i*10, chr(65+i)) for i in range(26))
   >>> d2 = dict((i**.5, i) for i in range(1000))
   >>> d1.viewkeys() & d2.viewkeys()
   set([0.0, 10.0, 20.0, 30.0])
   >>> d1.viewkeys() | range(0, 30)
   set([0, 1, 130, 3, 4, 5, 6, ..., 120, 250])

La vista realiza un seguimiento del diccionario y su contenido cambia
a medida que se modifica el diccionario:

   >>> vk = d.viewkeys()
   >>> vk
   dict_keys([0, 130, 10, ..., 250])
   >>> d[260] = '&'
   >>> vk
   dict_keys([0, 130, 260, 10, ..., 250])

Sin embargo, tenga en cuenta que no puede agregar o eliminar claves
mientras está iterando sobre la vista:

   >>> for k in vk:
   ...     d[k*2] = k
   ...
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   RuntimeError: dictionary changed size during iteration

Puede usar los métodos de vista en el código en Python 2.x, y el
convertidor 2to3 los cambiará a los métodos estándar "keys()",
"values()" y "items()".

Ver también:

  **PEP 3106** - Renovación dict.keys(), .values() y .items()
     PEP escrito por Guido van Rossum. Portado a 2.7 por Alexandre
     Vassalotti; bpo-1967.


PEP 3137: El objeto memoryview
==============================

El objeto "memoryview" proporciona una vista del contenido de la
memoria de otro objeto que coincide con la interfaz de tipo  "bytes".

   >>> import string
   >>> m = memoryview(string.letters)
   >>> m
   <memory at 0x37f850>
   >>> len(m)           # Returns length of underlying object
   52
   >>> m[0], m[25], m[26]   # Indexing returns one byte
   ('a', 'z', 'A')
   >>> m2 = m[0:26]         # Slicing returns another memoryview
   >>> m2
   <memory at 0x37f080>

El contenido de la vista se puede convertir en una cadena de bytes o
una lista de números enteros:

   >>> m2.tobytes()
   'abcdefghijklmnopqrstuvwxyz'
   >>> m2.tolist()
   [97, 98, 99, 100, 101, 102, 103, ... 121, 122]
   >>>

Los objetos "memoryview" permiten modificar el objeto subyacente si es
un objeto mutable.

   >>> m2[0] = 75
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   TypeError: cannot modify read-only memory
   >>> b = bytearray(string.letters)  # Creating a mutable object
   >>> b
   bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
   >>> mb = memoryview(b)
   >>> mb[0] = '*'         # Assign to view, changing the bytearray.
   >>> b[0:5]              # The bytearray has been changed.
   bytearray(b'*bcde')
   >>>

Ver también:

  **PEP 3137** - Bytes inmutables y búfer mutable
     PEP escrito por Guido van Rossum. Implementado por Travis
     Oliphant, Antoine Pitrou y otros. Portado a 2.7 por Antoine
     Pitrou; bpo-2396.


Otros cambios de lenguaje
=========================

Algunos de los cambios mas pequeños hechos al núcleo del lenguaje de
Python son:

* La sintaxis para literales de conjuntos se ha actualizado desde
  Python 3.x. Los corchetes se utilizan para rodear el contenido del
  conjunto mutable resultante; los literales de conjunto se distinguen
  de los diccionarios por no contener dos puntos ni valores. "{}"
  sigue representando un diccionario vacío; use "set()" para un
  conjunto vacío.

     >>> {1, 2, 3, 4, 5}
     set([1, 2, 3, 4, 5])
     >>> set() # empty set
     set([])
     >>> {}    # empty dict
     {}

  Portado por Alexandre Vassalotti; bpo-2335.

* El diccionario y las comprensiones de conjuntos son otra
  característica portada desde 3.x, que generaliza las comprensiones
  de listas / generadores para usar la sintaxis literal para conjuntos
  y diccionarios.

     >>> {x: x*x for x in range(6)}
     {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
     >>> {('a'*x) for x in range(6)}
     set(['', 'a', 'aa', 'aaa', 'aaaa', 'aaaaa'])

  Portado por Alexandre Vassalotti; bpo-2333.

* La declaración "with" ahora puede usar múltiples administradores de
  contexto en una declaración. Los administradores de contexto se
  procesan de izquierda a derecha y cada uno se trata como si
  comenzara una nueva declaración "with". Esto significa que:

     with A() as a, B() as b:
         ... suite of statements ...

  es equivalente a:

     with A() as a:
         with B() as b:
             ... suite of statements ...

  La función "contextlib.nested()" proporciona una función muy
  similar, por lo que ya no es necesaria y ha quedado obsoleta.

  (Propuesta en https://codereview.appspot.com/53094; implementado por
  Georg Brandl.)

* Las conversiones entre números de punto flotante y cadenas ahora se
  redondean correctamente en la mayoría de las plataformas. Estas
  conversiones ocurren en muchos lugares diferentes: "str()" en
  flotantes y números complejos; los constructores "float" y
  "complex"; formato numérico; serializar y deserializar flotantes y
  números complejos usando los módulos "marshal", "pickle" y "json";
  análisis de literales flotantes e imaginarios en código Python; y
  conversión "Decimal" a flotante.

  Relacionado con esto, el "repr()" de un número de punto flotante *x*
  ahora retorna un resultado basado en la cadena decimal más corta que
  se garantiza que se redondeará a *x* con el redondeo correcto (con
  el modo de redondeo *round-half-to-even*). Anteriormente, daba una
  cadena basada en redondear x a 17 dígitos decimales.

  La biblioteca de redondeo responsable de esta mejora funciona en
  Windows y en plataformas Unix utilizando los compiladores gcc, icc o
  suncc.  Puede haber un pequeño número de plataformas donde no se
  puede garantizar el correcto funcionamiento de este código, por lo
  que el código no se utiliza en dichos sistemas.  Puede averiguar qué
  código se está utilizando marcando "sys.float_repr_style", que será
  "short" si el nuevo código está en uso y "legacy" si no lo está.

  Implementado por Eric Smith y Mark Dickinson, utilizando la
  biblioteca de David Gay's "dtoa.c"; bpo-7117.

* Las conversiones de enteros largos y enteros regulares a punto
  flotante ahora redondean de forma diferente, retornando el número de
  punto flotante más cercano al número.  Esto no importa para los
  enteros pequeños que se pueden convertir exactamente, pero para los
  números grandes que inevitablemente perderán precisión, Python 2.7
  ahora se aproxima más.  Por ejemplo, Python 2.6 calculaba lo
  siguiente:

     >>> n = 295147905179352891391
     >>> float(n)
     2.9514790517935283e+20
     >>> n - long(float(n))
     65535L

  El resultado de punto flotante de Python 2.7 es mayor, pero mucho
  más cerca del valor verdadero:

     >>> n = 295147905179352891391
     >>> float(n)
     2.9514790517935289e+20
     >>> n - long(float(n))
     -1L

  (Implementado por Mark Dickinson; bpo-3166.)

  La división de enteros también es más precisa en su comportamiento
  de redondeo.  (También implementado por Mark Dickinson; bpo-1811.)

* Se ha eliminado la coerción implícita para números complejos; el
  intérprete ya no intentará llamar a un método "__coerce__()" en
  objetos complejos. (Eliminado por Meador Inge y Mark Dickinson;
  bpo-5211).

* El método "str.format()" soporta ahora la numeración automática de
  los campos de sustitución.  Esto hace que el uso de "str.format()"
  se asemeje más al uso del formateo "%s":

     >>> '{}:{}:{}'.format(2009, 04, 'Sunday')
     '2009:4:Sunday'
     >>> '{}:{}:{day}'.format(2009, 4, day='Sunday')
     '2009:4:Sunday'

  La numeración automática toma los campos de izquierda a derecha, por
  lo que el primer especificador "{...}" utilizará el primer argumento
  de "str.format()", el siguiente especificador utilizará el siguiente
  argumento, y así sucesivamente.  No se puede mezclar la numeración
  automática con la explícita - o se numeran todos los campos del
  especificador o ninguno - pero se puede mezclar la numeración
  automática con los campos con nombre, como en el segundo ejemplo
  anterior.  (Contribución de Eric Smith; bpo-5237.)

  Los números complejos ahora soportan correctamente el uso con
  "format()", y por defecto están alineados a la derecha. La
  especificación de una precisión o separación por comas se aplica
  tanto a la parte real como a la imaginaria del número, pero la
  anchura de campo y la alineación especificadas se aplican a la
  totalidad de la salida resultante "1,5+3j".  (Contribución de Eric
  Smith; bpo-1588 y bpo-7988)

  El código de formato 'F' ahora siempre formatea su salida utilizando
  caracteres en mayúsculas, por lo que ahora producirá 'INF' y 'NAN'.
  (Contribución de Eric Smith; bpo-3382.)

  Un cambio de bajo nivel: el método "object.__format__()" ahora
  activa un "PendingDeprecationWarning" si se le pasa una cadena de
  formato, porque el método "__format__()" para "object" convierte el
  objeto en una representación de cadena y la formatea. Anteriormente,
  el método aplicaba silenciosamente la cadena de formato a la
  representación de cadena, pero eso podía ocultar errores en el
  código Python. Si estás proporcionando información de formato, como
  una alineación o precisión, presumiblemente estás esperando que el
  formato se aplique de alguna manera específica del objeto.
  (Corregido por Eric Smith; bpo-7994).

* Los tipos "int()" y "long()" obtuvieron un método "bit_length" que
  devuelve la cantidad de bits necesarios para representar su
  argumento en binario:

     >>> n = 37
     >>> bin(n)
     '0b100101'
     >>> n.bit_length()
     6
     >>> n = 2**123-1
     >>> n.bit_length()
     123
     >>> (n+1).bit_length()
     124

  (Contribución de Fredrik Johansson y Victor Stinner; bpo-3439.)

* La instrucción "import" ya no intentará una importación absoluta si
  se produce un error en una importación relativa (por ejemplo, "from
  .os import sep").  Esto corrige un error, pero posiblemente podría
  romper ciertas instrucciones "import" que solo funcionaban por
  accidente.  (Arreglado por Meador Inge; bpo-7902.)

* Ahora es posible que una subclase del tipo "unicode" incorporado
  anule el método "__unicode__()". (Implementado por Victor Stinner;
  bpo-1583863).

* El método "translate()" del tipo "bytearray" ahora acepta "None"
  como primer argumento.  (Corregido por Georg Brandl; bpo-4759.)

* When using "@classmethod" and "@staticmethod" to wrap methods as
  class or static methods, the wrapper object now exposes the wrapped
  function as their "__func__" attribute. (Contributed by Amaury
  Forgeot d'Arc, after a suggestion by George Sakkis; bpo-5982.)

* Cuando se establecía un conjunto restringido de atributos utilizando
  "__slots__", la eliminación de un atributo no establecido no lanzaba
  "AttributeError" como cabría esperar.  Corregido por Benjamin
  Peterson; bpo-7604)

* Ahora se admiten dos nuevas codificaciones: "cp720", utilizada
  principalmente para el texto árabe; y "cp858", una variante de CP
  850 que añade el símbolo del euro.  (CP720 contribuido por Alexander
  Belchenko y Amaury Forgeot d'Arc en bpo-1616979; CP858 contribuido
  por Tim Hatch en bpo-8016)

* El objeto "file" ahora establecerá el atributo "filename" en la
  excepción "IOError" al intentar abrir un directorio en plataformas
  POSIX (observado por Jan Kaliszewski; bpo-4764), y ahora verifica
  explícitamente y prohíbe escribir en objetos de archivos de solo
  lectura en lugar de confiar en la biblioteca C para detectar e
  informar el error (corregido por Stefan Krah; bpo-5677).

* El tokenizador de Python ahora traduce los finales de línea por sí
  mismo, por lo que la función incorporada "compile()" ahora acepta
  código que utilice cualquier convención de final de línea.  Además,
  ya no requiere que el código termine en una nueva línea.

* Los paréntesis adicionales en las definiciones de función son
  ilegales en Python 3.x, lo que significa que se obtiene un error de
  sintaxis de "def f((x)): pass".  En el modo de advertencia Python3,
  Python 2.7 ahora advertirá sobre este uso no común. (Anotado por
  James Lingard; bpo-7362.)

* Ahora es posible crear referencias débiles a objetos de clase de
  estilo antiguo.  Las clases de estilo nuevo siempre eran de
  referencia débil.  (Corregido por Antoine Pitrou; bpo-8268.)

* Cuando se recicla un objeto de módulo, el diccionario del módulo
  ahora solo se borra si nadie más tiene una referencia al diccionario
  (bpo-7140).


Cambios en el intérprete
------------------------

Una nueva variable de entorno, "PYTHONWARNINGS", permite controlar las
advertencias.  Debe establecerse en una cadena que contenga la
configuración de advertencia, equivalente a las utilizadas con el
modificador "-W", separado por comas. (Contribuido por Brian Curtin;
bpo-7301.)

Por ejemplo, la siguiente configuración imprimirá advertencias cada
vez que se produzcan, pero convertirá las advertencias del módulo
"Cookie" en un error. (La sintaxis exacta para configurar una variable
de entorno varía según los sistemas operativos y los shells).

   exportar PYTHONWARNINGS=all,error:::Cookie:0


Optimizaciones
--------------

Se han añadido varias mejoras de rendimiento:

* Se agregó un nuevo código de operación para realizar la
  configuración inicial de las instrucciones "with" y buscar los
  métodos "__enter__()" y "__exit__()". (Contribuido por Benjamin
  Peterson).

* El recolector de basura ahora funciona mejor para un patrón de uso
  común: cuando se asignan muchos objetos sin desasignar ninguno de
  ellos.  Antes, la recogida de basura tardaba un tiempo cuadrático,
  pero ahora el número de recogidas de basura completas se reduce a
  medida que crece el número de objetos en el montón. La nueva lógica
  sólo realiza una pasada completa de recogida de basura cuando la
  generación intermedia ha sido recogida 10 veces y cuando el número
  de objetos supervivientes de la generación intermedia supera el 10%
  del número de objetos de la generación más antigua.  (Sugerido por
  Martin von Löwis e implementado por Antoine Pitrou; bpo-4074.)

* El recolector de basura intenta evitar el seguimiento de
  contenedores simples que no pueden formar parte de un ciclo. En
  Python 2.7, esto es ahora cierto para tuplas y diccionarios que
  contienen tipos atómicos (como enteros, cadenas, etc.).
  Transitoriamente, un dict que contenga tuplas de tipos atómicos
  tampoco será rastreado. Esto ayuda a reducir el coste de cada
  recogida de basura al disminuir el número de objetos que debe
  considerar y recorrer el recolector. (Contribución de Antoine
  Pitrou; bpo-4688.)

* Los enteros largos se almacenan ahora internamente en base 2**15 o
  en base 2**30, determinándose la base en el momento de la
  construcción.  Anteriormente, siempre se almacenaban en base 2**15.
  El uso de la base 2**30 proporciona mejoras significativas en el
  rendimiento de las máquinas de 64 bits, pero los resultados de las
  pruebas comparativas en las máquinas de 32 bits han sido
  contradictorios.  Por lo tanto, el valor por defecto es utilizar la
  base 2**30 en máquinas de 64 bits y la base 2**15 en máquinas de 32
  bits; en Unix, hay una nueva opción de configuración "--enable-big-
  digits" que puede utilizarse para anular este valor por defecto.

  Aparte de las mejoras de rendimiento, este cambio debería ser
  invisible para los usuarios finales, con una excepción: para fines
  de prueba y depuración, hay un nuevo structseq "sys.long_info" que
  proporciona información sobre el formato interno, dando el número de
  bits por dígito y el tamaño en bytes del tipo C utilizado para
  almacenar cada dígito:

     >>> importar sys
     >>> sys.long_info
     sys.long_info(bits_por_dígito=30, tamaño_del_dígito=4)

  (Contribución de Mark Dickinson; bpo-4258.)

  Otro conjunto de cambios hizo que los objetos largos fueran unos
  pocos bytes más pequeños: 2 bytes menos en sistemas de 32 bits y 6
  bytes en los de 64 bits. (Contribución de Mark Dickinson; bpo-5260.)

* El algoritmo de división de enteros largos se ha hecho más rápido
  ajustando el bucle interno, haciendo desplazamientos en lugar de
  multiplicaciones, y arreglando una iteración extra innecesaria.
  Varias pruebas de referencia muestran un aumento de velocidad de
  entre el 50% a y el 150% en las divisiones de enteros largos y en
  las operaciones de módulo. (Contribución de Mark Dickinson;
  bpo-5512). Las operaciones a nivel de bit también son
  significativamente más rápidas (parche inicial de Gregory Smith;
  bpo-1087418).

* La implementación de "%" comprueba si el operando de la izquierda es
  una cadena de Python y lo convierte en un caso especial; esto
  resulta en un aumento de rendimiento del 1--3% p para aplicaciones
  que utilizan frecuentemente "%" con cadenas, como las bibliotecas de
  plantillas. (Implementado por Collin Winter; bpo-5176.)

* Las comprensiones de listas con una condición "if" se compilan en
  código de bytes más rápido.  (Parche de Antoine Pitrou, portado a la
  2.7 por Jeffrey Yasskin; bpo-4715)

* La conversión de un entero o un entero largo a una cadena decimal se
  ha hecho más rápida mediante la conversión en base 10 en lugar de
  utilizar una función de conversión generalizada que soporta bases
  arbitrarias. (Parche de Gawain Bolton; bpo-6713.)

* Los métodos "split()", "replace()", "rindex()", "rpartition()" y
  "rsplit()" de tipos similares a cadenas (cadenas, cadenas Unicode y
  objetos "bytearray") ahora utilizan un algoritmo de búsqueda inversa
  rápida en lugar de un escaneo carácter por carácter. Esto a veces es
  diez veces más rápido. (Agregado por Florent Xicluna; bpo-7462 y
  bpo-7622).

* Los módulos "pickle" y "cPickle" ahora almacenan automáticamente en
  caché las cadenas utilizadas para los nombres de atributos, lo que
  reduce el uso de memoria de los objetos resultantes de la
  descompresión. (Contribuido por Jake McGuire; bpo-5084).

* El módulo "cPickle" ahora crea casos especiales para los
  diccionarios, reduciendo casi a la mitad el tiempo necesario para
  procesarlos. (Contribución de Collin Winter; bpo-5670.)


Módulos nuevos y mejorados
==========================

Como en cada versión, la biblioteca estándar de Python ha recibido una
serie de mejoras y correcciones de errores.  Aquí hay una lista
parcial de los cambios más notables, ordenados alfabéticamente por
nombre de módulo. Consulta el archivo "Misc/NEWS" en el árbol de
código fuente para una lista más completa de cambios, o mira los
registros de Subversion para todos los detalles.

* La clase base de depuración del módulo "bdb" "Bdb" obtuvo una
  función para omitir módulos.  El constructor ahora toma un iterable
  que contiene patrones de estilo glob como "django.*"; el depurador
  no entrará en los marcos de pila de un módulo que coincida con uno
  de estos patrones. (Aportado por Maru Newby tras una sugerencia de
  Senthil Kumaran; bpo-5142.)

* El módulo "binascii" soporta ahora la API del buffer, por lo que
  puede utilizarse con instancias de "memoryview" y otros objetos de
  buffer similares. (Tomado de la 3.x por Florent Xicluna; bpo-7703.)

* Módulo actualizado: el módulo "bsddb" ha sido actualizado desde
  4.7.2devel9 a la versión 4.8.4 de the pybsddb package. La nueva
  versión incluye una mejor compatibilidad con Python 3.x, varias
  correcciones de errores y añade varios nuevos indicadores y métodos
  de BerkeleyDB. (Actualizado por Jesús Cea Avión; bpo-8156. El
  registro de cambios de pybsddb se puede leer en
  https://hg.jcea.es/pybsddb/file/tip/ChangeLog.)

* El módulo "bz2" de "BZ2File" ahora soporta el protocolo de gestión
  de contexto, por lo que se puede escribir "con bz2.BZ2File(...) como
  f:". (Contribución de Hagen Fürstenau; bpo-3860.)

* Nueva clase: la clase "Counter" del módulo "collections" es útil
  para el recuento de datos. Las instancias de "Counter" se comportan
  mayoritariamente como los diccionarios, pero retornan cero si faltan
  claves en lugar de lanzar un "KeyError":

     >>> from collections import Counter
     >>> c = Counter()
     >>> for letter in 'here is a sample of english text':
     ...   c[letter] += 1
     ...
     >>> c
     Counter({' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2,
     'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1,
     'p': 1, 'r': 1, 'x': 1})
     >>> c['e']
     5
     >>> c['z']
     0

  Hay tres métodos adicionales de "Counter". "most_common()" retorna
  los N elementos más comunes y sus recuentos. "elements()" retorna un
  iterador sobre los elementos contenidos, repitiendo cada elemento
  tantas veces como su recuento. "subtract()" toma un iterable y resta
  uno por cada elemento en lugar de sumarlo; si el argumento es un
  diccionario u otra "Counter", los recuentos se restan.

     >>> c.most_common(5)
     [(' ', 6), ('e', 5), ('s', 3), ('a', 2), ('i', 2)]
     >>> c.elements() ->
        'a', 'a', ' ', ' ', ' ', ' ', ' ', ' ',
        'e', 'e', 'e', 'e', 'e', 'g', 'f', 'i', 'i',
        'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's',
        's', 's', 'r', 't', 't', 'x'
     >>> c['e']
     5
     >>> c.subtract('very heavy on the letter e')
     >>> c['e']    # Count is now lower
     -1

  Contribución de Raymond Hettinger; bpo-1696199.

  Nueva clase: "OrderedDict" se describe en la sección anterior PEP
  372: Adición de un diccionario ordenado a las colecciones.

  Nuevo método: El tipo de datos "deque" tiene ahora un método
  "count()" que retorna el número de elementos contenidos igual al
  argumento suministrado *x*, y un método "reverse()" que invierte los
  elementos del deque en su lugar. "deque" también expone su longitud
  máxima como el atributo de sólo lectura "maxlen". (Ambas
  características han sido añadidas por Raymond Hettinger)

  La clase "namedtuple" tiene ahora un parámetro opcional *rename*. Si
  *rename* es verdadero, los nombres de campo que no son válidos
  porque se han repetido o no son identificadores legales de Python
  serán renombrados a nombres legales que se derivan de la posición
  del campo dentro de la lista de campos:

  >>> from collections import namedtuple
  >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True)
  >>> T._fields
  ('field1', '_1', '_2', 'field2')

  (Añadido por Raymond Hettinger; bpo-1818.)

  Por último, la clase base abstracta "Mapping" ahora devuelve
  "NotImplemented" si se compara una asignación con otro tipo que no
  es "Mapping". (Corregido por Daniel Stutzbach; bpo-8729).

* Los constructores de las clases de análisis del módulo
  "ConfigParser" ahora aceptan un parámetro *allow_no_value*, cuyo
  valor predeterminado es falso; si es verdadero, se permitirán
  opciones sin valores. Por ejemplo:

     >>> import ConfigParser, StringIO
     >>> sample_config = """
     ... [mysqld]
     ... user = mysql
     ... pid-file = /var/run/mysqld/mysqld.pid
     ... skip-bdb
     ... """
     >>> config = ConfigParser.RawConfigParser(allow_no_value=True)
     >>> config.readfp(StringIO.StringIO(sample_config))
     >>> config.get('mysqld', 'user')
     'mysql'
     >>> print config.get('mysqld', 'skip-bdb')
     None
     >>> print config.get('mysqld', 'unknown')
     Traceback (most recent call last):
       ...
     NoOptionError: No option 'unknown' in section: 'mysqld'

  (Contribución de Mats Kindahl; bpo-7005.)

* Función obsoleta: "contextlib.nested()", que permite manejar más de
  un administrador de contexto con una sola declaración "with", ha
  quedado obsoleta, porque la declaración "with" ahora admite
  múltiples administradores de contexto.

* El módulo "cookielib" ahora ignora las cookies que tienen un campo
  de versión no válido, es decir, que no contiene un valor entero.
  (Corregido por John J. Lee; bpo-3924).

* La función "deepcopy()" del módulo "copy" ahora copiará
  correctamente los métodos de instancia vinculados.  (Implementado
  por Robert Collins; bpo-1515.)

* El módulo "ctypes" ahora convierte siempre "None" a un puntero C
  "NULL" para los argumentos declarados como punteros.  (Cambiado por
  Thomas Heller; bpo-4606.) La biblioteca subyacente libffi ha sido
  actualizada a la versión 3.0.9, que contiene varias correcciones
  para diferentes plataformas.  (Actualizado por Matthias Klose;
  bpo-8142.)

* Nuevo método: la clase "timedelta" del módulo "datetime" ha ganado
  un método "total_seconds()" que retorna el número de segundos de la
  duración.  (Contribución de Brian Quinlan; bpo-5788.)

* Nuevo método: la clase "Decimal" obtuvo un método de clase
  "from_float()" que realiza una conversión exacta de un número de
  punto flotante a un "Decimal". Esta conversión exacta busca la
  aproximación decimal más cercana al valor de la representación de
  punto flotante; por lo tanto, el valor decimal resultante seguirá
  incluyendo la inexactitud, si la hubiera. Por ejemplo,
  "Decimal.from_float(0.1)" devuelve "Decimal('0.10000000000000000555
  11151231257827021181583404541015625')". (Implementado por Raymond
  Hettinger; bpo-4796).

  La comparación de instancias de "Decimal" con números de punto
  flotante ahora produce resultados razonables basados ​​en los
  valores numéricos de los operandos. Anteriormente, dichas
  comparaciones recurrían a las reglas predeterminadas de Python para
  comparar objetos, que producían resultados arbitrarios basados ​​en
  su tipo. Tenga en cuenta que aún no puede combinar "Decimal" y punto
  flotante en otras operaciones como la suma, ya que debe elegir
  explícitamente cómo convertir entre float y "Decimal". (Corregido
  por Mark Dickinson; bpo-2531).

  El constructor de "Decimal" acepta ahora números en coma flotante
  (añadido por Raymond Hettinger; bpo-8257) y caracteres Unicode no
  europeos, como los dígitos arábigos-índicos (contribución de Mark
  Dickinson; bpo-6595).

  La mayoría de los métodos de la clase "Context" ahora aceptan
  enteros así como instancias de "Decimal"; las únicas excepciones son
  los métodos "canonical()" y "is_canonical()".  (Parche de Juan José
  Conti; bpo-7633.)

  Cuando se utilizan instancias "Decimal" con el método "format()" de
  una cadena, la alineación por defecto era antes la izquierda.  Esto
  se ha cambiado a la alineación derecha, que es más sensible para los
  tipos numéricos.  (Cambiado por Mark Dickinson; bpo-6857.)

  Las comparaciones que implican un valor NaN de señalización (o
  "sNAN") señalan ahora "InvalidOperation" en lugar de retornar
  silenciosamente un valor verdadero o falso dependiendo del operador
  de comparación.  Los valores NaN silenciosos (o "NaN") son ahora
  hashable.  (Corregido por Mark Dickinson; bpo-7279.)

* El módulo "difflib" produce ahora una salida más compatible con las
  herramientas modernas **diff**/**patch** mediante un pequeño cambio,
  utilizando un carácter de tabulación en lugar de espacios como
  separador en la cabecera que da el nombre del fichero.  (Corregido
  por Anatoly Techtonik; bpo-7585.)

* El comando Distutils "sdist" ahora siempre regenera el archivo
  "MANIFEST", ya que aunque los archivos "MANIFEST.in" o "setup.py" no
  hayan sido modificados, el usuario podría haber creado algunos
  archivos nuevos que deberían ser incluidos. (Corregido por Tarek
  Ziadé; bpo-8688.)

* El indicador "IGNORE_EXCEPTION_DETAIL" del módulo "doctest" ahora
  ignorará el nombre del módulo que contiene la excepción que se está
  probando. (Parche de Lennart Regebro; bpo-7490).

* La clase "Message" del módulo "email" ahora aceptará una carga útil
  con valor Unicode y convertirá automáticamente la carga útil a la
  codificación especificada por "output_charset". (Agregado por R.
  David Murray; bpo-1368247).

* La clase "Fraction" acepta ahora una instancia de float o "Decimal",
  o dos números racionales, como argumentos para su constructor.
  (Implementado por Mark Dickinson; los racionales se añadieron en
  bpo-5812, y float/decimal en bpo-8294)

  Las comparaciones de ordenación ("<", "<=", ">", ">=") entre
  fracciones y números complejos ahora lanzan un "TypeError". Esto
  corrige un descuido, haciendo que la "Fraction" coincida con los
  otros tipos numéricos.

* Nueva clase: "FTP_TLS" en el módulo "ftplib" proporciona conexiones
  FTP seguras utilizando la encapsulación TLS de la autenticación, así
  como las posteriores transferencias de control y datos. (Contribuido
  por Giampaolo Rodola; bpo-2054.)

  El método "storbinary()" para subidas binarias puede ahora reiniciar
  las subidas gracias a un parámetro *rest* añadido (parche de Pablo
  Mouzo; bpo-6845)

* Nuevo decorador de clase: "total_ordering()" en el módulo
  "functools" toma una clase que define un método "__eq__()" y uno de
  "__lt__()", "__le__()", "__gt__()" o "__ge__()", y genera los
  métodos de comparación faltantes. Dado que el método "__cmp__()"
  está quedando obsoleto en Python 3.x, este decorador facilita la
  definición de clases ordenadas. (Agregado por Raymond Hettinger;
  bpo-5479).

  Nueva función: "cmp_to_key()" tomará una función de comparación de
  estilo antiguo que espera dos argumentos y retornará una nueva
  llamada que puede usarse como parámetro *clave* para funciones como
  "sorted()", "min()" y "max()", etc.  El principal uso previsto es
  ayudar a hacer el código compatible con Python 3.x. (Añadido por
  Raymond Hettinger.)

* Nueva función: la "gc()" del módulo "is_tracked" retorna true si una
  instancia dada es rastreada por el recolector de basura, false en
  caso contrario. (Contribución de Antoine Pitrou; bpo-4688.)

* El módulo "gzip" "GzipFile" soporta ahora el protocolo de gestión de
  contexto, por lo que se puede escribir "con gzip.GzipFile(...) como
  f:" (contribución de Hagen Fürstenau; bpo-3860), y ahora implementa
  el ABC de "io.BufferedIOBase", por lo que se puede envolver con
  "io.BufferedReader" para un procesamiento más rápido (contribución
  de Nir Aides; bpo-7471). Ahora también es posible anular la hora de
  modificación registrada en un archivo gzipped proporcionando una
  marca de tiempo opcional al constructor.  (Contribución de Jacques
  Frechet; bpo-4272.)

  Los archivos en formato gzip pueden ser rellenados con bytes cero al
  final; el módulo "gzip" ahora consumirá estos bytes al final.
  (Corregido por Tadek Pietraszek y Brian Curtin; bpo-2846)

* Nuevo atributo: el módulo "hashlib" ahora tiene un atributo
  "algorithms" que contiene una tupla que nombra los algoritmos
  admitidos. En Python 2.7, "hashlib.algorithms" contiene "('md5',
  'sha1', 'sha224', 'sha256', 'sha384', 'sha512')". (Contribuido por
  Carl Chenet; bpo-7418).

* La clase "HTTPResponse" predeterminada que utiliza el módulo
  "httplib" ahora admite el almacenamiento en búfer, lo que permite
  una lectura mucho más rápida de las respuestas HTTP. (Contribuido
  por Kristján Valur Jónsson; bpo-4879).

  Las clases "HTTPConnection" y "HTTPSConnection" ahora admiten un
  parámetro *source_address*, una tupla de 2 "(host, port)" que
  proporciona la dirección de origen que se utilizará para la
  conexión. (Contribuido por Eldon Ziegler; bpo-3972).

* El módulo "ihooks" ahora admite importaciones relativas. Tenga en
  cuenta que "ihooks" es un módulo más antiguo para personalizar
  importaciones, reemplazado por el módulo "imputil" agregado en
  Python 2.0. (Neil Schemenauer agregó compatibilidad con
  importaciones relativas).

* El módulo "imaplib" ahora soporta direcciones IPv6. (Contribución de
  Derek Morr; bpo-1655.)

* Nueva función: la "getcallargs()" del módulo "inspect" toma una
  llamada y sus argumentos posicionales y de palabra clave, y calcula
  qué parámetros de la llamada recibirán cada argumento, retornando un
  diccionario que asigna los nombres de los argumentos a sus valores.
  Por ejemplo:

     >>> from inspect import getcallargs
     >>> def f(a, b=1, *pos, **named):
     ...     pass
     ...
     >>> getcallargs(f, 1, 2, 3)
     {'a': 1, 'b': 2, 'pos': (3,), 'named': {}}
     >>> getcallargs(f, a=2, x=4)
     {'a': 2, 'b': 1, 'pos': (), 'named': {'x': 4}}
     >>> getcallargs(f)
     Traceback (most recent call last):
     ...
     TypeError: f() takes at least 1 argument (0 given)

  Contribución de George Sakkis; bpo-3135.

* Módulo actualizado: La biblioteca "io" se ha actualizado a la
  versión que viene con Python 3.1. Para la versión 3.1, la biblioteca
  de E/S se reescribió completamente en C y es de 2 a 20 veces más
  rápida según la tarea que se esté realizando. La versión original de
  Python se renombró como módulo "_pyio".

  Un cambio resultante menor: la clase "io.TextIOBase" ahora tiene un
  atributo "errors" que proporciona la configuración de error
  utilizada para codificar y decodificar errores (uno de "'strict'",
  "'replace'", "'ignore'").

  La clase "io.FileIO" ahora lanza un "OSError" cuando se le pasa un
  descriptor de fichero no válido.  (Implementado por Benjamin
  Peterson; bpo-4991.) El método "truncate()" ahora preserva la
  posición del archivo; antes cambiaba la posición del archivo al
  final del nuevo archivo.  (Corregido por Pascal Chambon; bpo-6939.)

* Nueva función: "itertools.compress(data, selectors)" toma dos
  iteradores.  Los elementos de *datos* se retornan si el valor
  correspondiente en *selectores* es verdadero:

     itertools.compress('ABCDEF', [1,0,1,0,1,1]) =>
     A, C, E, F

  Nueva función: "itertools.combinations_with_replacement(iter, r)"
  retorna todas las posibles combinaciones de elementos de longitud
  *r* del iterable *iter*.  A diferencia de "combinations()", los
  elementos individuales pueden repetirse en las combinaciones
  generadas:

     itertools.combinations_with_replacement('abc', 2) =>
       ('a', 'a'), ('a', 'b'), ('a', 'c'),
       ('b', 'b'), ('b', 'c'), ('c', 'c')

  Tenga en cuenta que los elementos se tratan como únicos en función
  de su posición en la entrada, no de sus valores reales.

  La función "itertools.count()" tiene ahora un argumento *step* que
  permite incrementar por valores distintos de 1. "count()" también
  permite ahora argumentos de palabra clave, y utilizar valores no
  enteros como números de punto flotante o instancias de "Decimal".
  (Implementado por Raymond Hettinger; bpo-5032.)

  "itertools.combinaciones()" y "itertools.producto()" anteriormente
  lanzaban "ValueError" para valores de *r* mayores que el iterable de
  entrada.  Esto se consideraba un error de especificación, por lo que
  ahora retornan un iterador vacío.  (Corregido por Raymond Hettinger;
  bpo-4816.)

* Módulo actualizado: El módulo "json" ha sido actualizado a la
  versión 2.0.9 del paquete simplejson, que incluye una extensión en C
  que hace más rápida la codificación y decodificación. (Contribuido
  por Bob Ippolito; bpo-4136.)

  Para soportar el nuevo tipo "collections.OrderedDict", "json.load()"
  tiene ahora un parámetro opcional *object_pairs_hook* que será
  llamado con cualquier objeto literal que decodifique a una lista de
  pares. (Contribución de Raymond Hettinger; bpo-5381.)

* La clase "mailbox" del módulo "Maildir" ahora registra la marca de
  tiempo de los directorios que lee, y sólo los relee si la hora de
  modificación ha cambiado posteriormente.  Esto mejora el rendimiento
  al evitar escaneos innecesarios de directorios.  (Corregido por A.M.
  Kuchling y Antoine Pitrou; bpo-1607951, bpo-6896)

* Nuevas funciones: el módulo "math" ganó "erf()" y "erfc()" para la
  función de error y la función de error complementaria, "expm1()" que
  calcula "e**x - 1" con más precisión que usando "exp()" y restando
  1, "gamma()" para la función Gamma, y "lgamma()" para el logaritmo
  natural de la función Gamma. (Contribución de Mark Dickinson y
  nirinA raseliarison; bpo-3366.)

* A las clases "Manager*" del módulo "multiprocessing" ahora se les
  puede pasar un elemento invocable que se llamará cada vez que se
  inicie un subproceso, junto con un conjunto de argumentos que se le
  pasarán al elemento invocable. (Contribuido por lekma; bpo-5585).

  La clase "Pool", que controla un grupo de procesos de trabajo, ahora
  tiene un parámetro *maxtasksperchild* opcional. Los procesos de
  trabajo realizarán la cantidad especificada de tareas y luego
  saldrán, lo que hará que "Pool" inicie un nuevo proceso de trabajo.
  Esto es útil si las tareas pueden perder memoria u otros recursos, o
  si algunas tareas harán que el proceso de trabajo se vuelva muy
  grande. (Contribuido por Charles Cazabon; bpo-6963).

* El módulo "nntplib" ahora admite direcciones IPv6. (Contribución de
  Derek Morr; bpo-1664).

* Nuevas funciones: el módulo "os" envuelve las siguientes llamadas al
  sistema POSIX: "getresgid()" y "getresuid()", que retornan los GIDs
  y UIDs reales, efectivos y guardados; "setresgid()" y "setresuid()",
  que establecen los GIDs y UIDs reales, efectivos y guardados a
  nuevos valores; "initgroups()", que inicializan la lista de acceso a
  grupos para el proceso actual.  (Funciones GID/UID contribuidas por
  Travis H.; bpo-6508.  Soporte para initgroups añadido por Jean-Paul
  Calderone; bpo-7333)

  La función "os.fork()" ahora reinicializa el bloqueo de importación
  en el proceso hijo; esto soluciona los problemas en Solaris cuando
  "fork()" se llama desde un hilo.  (Corregido por Zsolt Cserna;
  bpo-7242.)

* En el módulo "os.path", las funciones "normpath()" y "abspath()"
  ahora preservan Unicode; si su ruta de entrada es una cadena
  Unicode, el valor de retorno es también una cadena Unicode.
  ("normpath()" arreglado por Matt Giuca en bpo-5827; "abspath()"
  arreglado por Ezio Melotti en bpo-3426)

* El módulo "pydoc" tiene ahora ayuda para los distintos símbolos que
  utiliza Python.  Ahora puedes hacer "help('<<')" o "help('@')", por
  ejemplo. (Contribución de David Laban; bpo-4739.)

* Las funciones "re" del módulo "split()", "sub()" y "subn()" aceptan
  ahora un argumento opcional *flags*, por coherencia con las demás
  funciones del módulo.  (Añadido por Gregory P. Smith)

* Nueva función: "run_path()" en el módulo "runpy" ejecutará el código
  en un argumento *ruta* proporcionado.  *path* puede ser la ruta de
  un fichero fuente de Python ("ejemplo.py"), un fichero bytecode
  compilado ("ejemplo.pyc"), un directorio ("./package/"), o un
  archivo zip ("ejemplo.zip").  Si se proporciona un directorio o una
  ruta zip, se añadirá al frente de "sys.path" y se importará el
  módulo "__main__".  Se espera que el directorio o zip contenga un
  "__main__.py"; si no es así, algún otro "__main__.py" podría ser
  importado desde una ubicación posterior en "sys.path".  Esto hace
  que más de la maquinaria de "runpy" esté disponible para los scripts
  que quieran imitar la forma en que la línea de comandos de Python
  procesa un nombre de ruta explícito. (Añadido por Nick Coghlan;
  bpo-6816.)

* Nueva función: en el módulo "shutil", "make_archive()" toma un
  nombre de fichero, un tipo de archivo (formato zip o tar) y una ruta
  de directorio, y crea un archivo con el contenido del directorio.
  (Añadido por Tarek Ziadé.)

  Las funciones "shutil" "copyfile()" y "copytree()" ahora lanzan una
  excepción "SpecialFileError" cuando se les pide que copien una
  tubería con nombre.  Anteriormente, el código trataba las tuberías
  con nombre como un archivo normal, abriéndolas para su lectura, lo
  que bloqueaba indefinidamente.  (Corregido por Antoine Pitrou;
  bpo-3002.)

* El módulo "signal" ya no reinstala el manejador de señales a menos
  que sea realmente necesario, lo que corrige un error que podía hacer
  imposible atrapar la señal EINTR de forma robusta.  (Corregido por
  Charles-Francois Natali; bpo-8354.)

* Nuevas funciones: en el módulo "site", tres nuevas funciones
  devuelven varias rutas específicas del sitio y del usuario.
  "getsitepackages()" devuelve una lista que contiene todos los
  directorios de paquetes del sitio globales, "getusersitepackages()"
  devuelve la ruta del directorio de paquetes del sitio del usuario y
  "getuserbase()" devuelve el valor de la variable de entorno
  "USER_BASE", que proporciona la ruta a un directorio que se puede
  utilizar para almacenar datos. (Contribuido por Tarek Ziadé;
  bpo-6693.)

  El módulo "site" ahora informa de las excepciones que se producen
  cuando se importa el módulo "sitecustomize", y ya no atrapará y
  tragará la excepción "KeyboardInterrupt".  (Corregido por Victor
  Stinner; bpo-3137.)

* La función "create_connection()" ganó un parámetro
  *dirección_de_origen*, una 2-tupla "(host, port)" que da la
  dirección de origen que se utilizará para la conexión. (Contribuido
  por Eldon Ziegler; bpo-3972.)

  Los métodos "recv_into()" y "recvfrom_into()" ahora escribirán en
  objetos que soporten la API de búfer, más útilmente los objetos
  "bytearray" y "memoryview".  (Implementado por Antoine Pitrou;
  bpo-8104.)

* La clase "TCPServer" del módulo "SocketServer" ahora admite tiempos
  de espera de socket y la desactivación del algoritmo Nagle. El
  atributo de clase "disable_nagle_algorithm" tiene como valor
  predeterminado "False"; si se sobrescribe como verdadero, las nuevas
  conexiones de solicitud tendrán la opción TCP_NODELAY configurada
  para evitar el almacenamiento en búfer de muchos envíos pequeños en
  un solo paquete TCP. El atributo de clase "timeout" puede contener
  un tiempo de espera en segundos que se aplicará al socket de
  solicitud; si no se recibe ninguna solicitud dentro de ese tiempo,
  se llamará a "handle_timeout()" y "handle_request()" regresará.
  (Contribuido por Kristján Valur Jónsson; bpo-6192 y bpo-6267).

* Módulo actualizado: el módulo "sqlite3" ha sido actualizado a la
  versión 2.6.0 del paquete pysqlite. La versión 2.6.0 incluye una
  serie de correcciones de errores y añade la posibilidad de cargar
  extensiones de SQLite desde bibliotecas compartidas. Llame al método
  "enable_load_extension(True)" para habilitar las extensiones, y
  luego llame a "load_extension()" para cargar una biblioteca
  compartida en particular. (Actualizado por Gerhard Häring.)

* The "ssl" module's "SSLSocket" objects now support the buffer API,
  which fixed a test suite failure (fix by Antoine Pitrou; bpo-7133)
  and automatically set OpenSSL's "SSL_MODE_AUTO_RETRY", which will
  prevent an error code being returned from "recv()" operations that
  trigger an SSL renegotiation (fix by Antoine Pitrou; bpo-8222).

  La función constructora "wrap_socket()" ahora acepta un argumento
  *ciphers* que es una cadena que enumera los algoritmos de cifrado
  que se permitirán; el formato de la cadena se describe en in the
  OpenSSL documentation. (Agregado por Antoine Pitrou; bpo-8322).

  Otro cambio hace que la extensión cargue todos los cifrados y
  algoritmos de compendio de OpenSSL para que estén todos disponibles.
  Algunos certificados SSL no podían ser verificados, reportando un
  error de "algoritmo desconocido".  (Informado por Beda Kosata, y
  corregido por Antoine Pitrou; bpo-8484)

  La versión de OpenSSL que se está utilizando ahora está disponible
  como atributos de módulo "ssl.OPENSSL_VERSION" (una cadena),
  "ssl.OPENSSL_VERSION_INFO" (una tupla de 5) y
  "ssl.OPENSSL_VERSION_NUMBER" (un entero). (Agregado por Antoine
  Pitrou; bpo-8321).

* El módulo "struct" ya no ignorará silenciosamente los errores de
  desbordamiento cuando un valor sea demasiado grande para un código
  de formato de entero en particular (uno de "bBhHiIlLqQ"); ahora
  siempre genera una excepción "struct.error". (Modificado por Mark
  Dickinson; bpo-1523). La función "pack()" también intentará usar
  "__index__()" para convertir y empaquetar números que no sean
  enteros antes de intentar el método "__int__()" o informar un error.
  (Modificado por Mark Dickinson; bpo-8300).

* Nueva función: la función "check_output()" del módulo "subprocess"
  ejecuta un comando con un conjunto de argumentos especificado y
  retorna la salida del comando como una cadena de texto cuando el
  comando se ejecuta sin errores, o lanza una excepción
  "CalledProcessError" en caso contrario.

     >>> subprocess.check_output(['df', '-h', '.'])
     'Filesystem     Size   Used  Avail Capacity  Mounted on\n
     /dev/disk0s2    52G    49G   3.0G    94%    /\n'

     >>> subprocess.check_output(['df', '-h', '/bogus'])
       ...
     subprocess.CalledProcessError: Command '['df', '-h', '/bogus']' returned non-zero exit status 1

  (Contribución de Gregory P. Smith.)

  El módulo "subprocess" ahora volverá a intentar realizar llamadas
  internas al sistema al recibir una señal "EINTR". (Varias personas
  lo informaron; parche final de Gregory P. Smith en bpo-1068268).

* Nueva función: "is_declared_global()" en el módulo "symtable"
  retorna true para las variables declaradas explícitamente como
  globales, false para las que son implícitamente globales.
  (Contribución de Jeremy Hylton)

* El módulo "syslog" utilizará ahora el valor de "sys.argv[0]" como
  identificador en lugar del anterior valor por defecto de "'python".
  (Cambiado por Sean Reifschneider; bpo-8451.)

* The "sys.version_info" value is now a named tuple, with attributes
  named "major", "minor", "micro", "releaselevel", and "serial".
  (Contributed by Ross Light; bpo-4285.)

  "sys.getwindowsversion()" también devuelve una tupla con nombre, con
  atributos denominados "major", "minor", "build", "platform",
  "service_pack", "service_pack_major", "service_pack_minor",
  "suite_mask" y "product_type". (Contribuido por Brian Curtin;
  bpo-7766).

* El manejo de errores por defecto del módulo "tarfile" ha cambiado,
  para no suprimir los errores fatales.  El nivel de error por defecto
  era antes 0, lo que significaba que los errores sólo daban lugar a
  que se escribiera un mensaje en el registro de depuración, pero como
  el registro de depuración no está activado por defecto, estos
  errores pasan desapercibidos.  El nivel de error por defecto es
  ahora 1, que lanza una excepción si hay un error. (Cambiado por Lars
  Gustäbel; bpo-7357.)

  "tarfile" ahora soporta el filtrado de los objetos "TarInfo" que se
  añaden a un fichero tar.  Cuando llame a "add()", puede suministrar
  un argumento opcional *filtro* que es una llamada.  Al *filtro* se
  le pasará la clase "TarInfo" de cada fichero que se añada, y podrá
  modificarlo y retornarlo. Si la llamada retorna "Nada", el fichero
  será excluido del archivo resultante.  Esto es más potente que el
  argumento *exclude* existente, que por lo tanto ha sido obviado.
  (Añadido por Lars Gustäbel; bpo-6856.) La clase "TarFile" también
  soporta ahora el protocolo de gestión de contexto. (Añadido por Lars
  Gustäbel; bpo-7232.)

* El método "wait()" de la clase "threading.Event" ahora retorna la
  bandera interna al salir.  Esto significa que el método normalmente
  retornará true porque "wait()" se supone que bloquea hasta que la
  bandera interna se convierte en true.  El valor de retorno sólo será
  falso si se proporcionó un tiempo de espera y la operación expiró.
  (Contribuido por Tim Lesher; bpo-1674032.)

* La base de datos Unicode proporcionada por el módulo "unicodedata"
  se utiliza ahora internamente para determinar qué caracteres son
  numéricos, espacios en blanco o representan saltos de línea.  La
  base de datos también incluye información del archivo de datos
  "Unihan.txt" (parche de Anders Chrigström y Amaury Forgeot d'Arc;
  bpo-1571184) y se ha actualizado a la versión 5.2.0 (actualizado por
  Florent Xicluna; bpo-8024).

* El módulo "urlsplit()" del "urlparse" ahora maneja esquemas de URL
  desconocidos de una manera compatible con el **RFC 3986**: si la URL
  tiene el formato ""<something>://..."", el texto antes del "://" se
  trata como el esquema, incluso si es un esquema inventado que el
  módulo no conoce. Este cambio puede romper el código que funcionaba
  con el comportamiento anterior. Por ejemplo, Python 2.6.4 o 2.5
  devolverá lo siguiente:

     >>> import urlparse
     >>> urlparse.urlsplit('invented://host/nombre_archivo?consulta')
     ('invented', '', '//host/nombre_archivo?consulta', '', '')

  Python 2.7 (y Python 2.6.5) retornará:

     >>> import urlparse
     >>> urlparse.urlsplit('invented://host/filename?query')
     ('invented', 'host', '/filename?query', '', '')

  (Python 2.7 en realidad produce una salida ligeramente diferente, ya
  que retorna una tupla con nombre en lugar de una tupla estándar)

  El módulo "urlparse" también admite direcciones literales IPv6 según
  lo definido por **RFC 2732** (contribuido por Senthil Kumaran;
  bpo-2987).

     >>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo')
     ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]',
     path='/foo', params='', query='', fragment='')

* Nueva clase: la clase "WeakSet" del módulo "weakref" es un conjunto
  que sólo contiene referencias débiles a sus elementos; los elementos
  serán eliminados una vez que no haya referencias que apunten a
  ellos. (Implementado originalmente en Python 3.x por Raymond
  Hettinger, y Portado a 2.7 por Michael Foord)

* La biblioteca "xml.etree.ElementTree" ya no omite los símbolos & ni
  los corchetes angulares al generar una instrucción de procesamiento
  XML (que se parece a "<?xml-stylesheet href="#style1"?>") o un
  comentario (que se parece a "<!-- comment -->"). (Parche de Neil
  Muller; bpo-2746).

* El cliente y el servidor XML-RPC, proporcionados por los módulos
  "xmlrpclib" y "SimpleXMLRPCServer", han mejorado su rendimiento al
  admitir la función keep-alive de HTTP/1.1 y al utilizar
  opcionalmente la codificación gzip para comprimir el XML que se
  intercambia. La compresión gzip está controlada por el atributo
  "encode_threshold" de "SimpleXMLRPCRequestHandler", que contiene un
  tamaño en bytes; las respuestas más grandes que este tamaño se
  comprimirán. (Contribuido por Kristján Valur Jónsson; bpo-6267.)

* El módulo "zipfile" de "ZipFile" soporta ahora el protocolo de
  gestión de contexto, por lo que se puede escribir "con
  zipfile.ZipFile(...) como f:". (Contribución de Brian Curtin;
  bpo-5511.)

  "zipfile" ahora también permite archivar directorios vacíos y
  extraerlos correctamente. (Corregido por Kuba Wieczorek; bpo-4710.)
  La lectura de archivos de un archivo es más rápida y la
  intercalación de "read()" y "readline()" ahora funciona
  correctamente. (Contribuido por Nir Aides; bpo-7610.)

  La función "is_zipfile()" acepta ahora un objeto archivo, además de
  los nombres de ruta aceptados en versiones anteriores.
  (Contribución de Gabriel Genellina; bpo-4756.)

  El método "writestr()" tiene ahora un parámetro opcional
  *compress_type* que permite anular el método de compresión por
  defecto especificado en el constructor "ZipFile".  (Contribución de
  Ronald Oussoren; bpo-6003.)


Nuevo módulo: importlib
-----------------------

Python 3.1 incluye el paquete "importlib", una reimplementación de la
lógica subyacente a la declaración "import" de Python. "importlib" es
útil para los implementadores de intérpretes de Python y para los
usuarios que desean escribir nuevos importadores que puedan participar
en el proceso de importación. Python 2.7 no contiene el paquete
"importlib" completo, sino que tiene un pequeño subconjunto que
contiene una única función, "import_module()".

"import_module(name, package=None)" importa un módulo.  *name* es una
cadena que contiene el nombre del módulo o paquete.  Es posible
realizar importaciones relativas proporcionando una cadena que
comience con un carácter ".", como "..utils.errors".  Para las
importaciones relativas, el argumento *paquete* debe ser proporcionado
y es el nombre del paquete que se utilizará como ancla para la
importación relativa. "import_module()" inserta el módulo importado en
"sys.modules" y retorna el objeto módulo.

He aquí algunos ejemplos:

   >>> from importlib import import_module
   >>> anydbm = import_module('anydbm')  # Standard absolute import
   >>> anydbm
   <module 'anydbm' from '/p/python/Lib/anydbm.py'>
   >>> # Relative import
   >>> file_util = import_module('..file_util', 'distutils.command')
   >>> file_util
   <module 'distutils.file_util' from '/python/Lib/distutils/file_util.pyc'>

"importlib" fue implementado por Brett Cannon e introducido en Python
3.1.


Nuevo módulo: sysconfig
-----------------------

El módulo "sysconfig" ha sido retirado del paquete Distutils,
convirtiéndose en un nuevo módulo de alto nivel por derecho propio.
"sysconfig" proporciona funciones para obtener información sobre el
proceso de construcción de Python: interruptores del compilador, rutas
de instalación, el nombre de la plataforma y si Python se está
ejecutando desde su directorio fuente.

Algunas de las funciones del módulo son:

* "get_config_var()" retorna variables del Makefile de Python y del
  fichero "pyconfig.h".

* "get_config_vars()" retorna un diccionario que contiene todas las
  variables de configuración.

* "get_path()" retorna la ruta configurada para un tipo de módulo
  concreto: la biblioteca estándar, módulos específicos del sitio,
  módulos específicos de la plataforma, etc.

* "is_python_build()" retorna true si está ejecutando un binario desde
  un árbol de fuentes de Python, y false en caso contrario.

Consulte la documentación de "sysconfig" para más detalles y para una
lista completa de funciones.

El paquete Distutils y "sysconfig" son ahora mantenidos por Tarek
Ziadé, que también ha iniciado un paquete Distutils2 (repositorio de
fuentes en https://hg.python.org/distutils2/) para desarrollar una
versión de próxima generación de Distutils.


ttk: Widgets temáticos para Tk
------------------------------

Tcl/Tk 8.5 incluye un conjunto de widgets temáticos que reimplementan
los widgets básicos de Tk pero tienen una apariencia más
personalizable y, por tanto, pueden parecerse más a los widgets de la
plataforma nativa.  Este conjunto de widgets se llamaba originalmente
Tile, pero fue renombrado a Ttk (por "Tk temático") al ser añadido a
la versión 8.5 de Tcl/Tck.

Para obtener más información, lea la documentación del módulo "ttk".
También puede leer la página del manual de Tcl/Tk que describe el
motor de temas Ttk, disponible en
https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.html. Algunas capturas
de pantalla del código Python/Ttk en uso se encuentran en
https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki.

El módulo "tkinter.ttk" fue escrito por Guilherme Polo y se agregó en
bpo-2983. Se propuso una versión alternativa llamada "Tile.py",
escrita por Martin Franklin y mantenida por Kevin Walzer, para su
inclusión en bpo-2618, pero los autores argumentaron que el trabajo de
Guilherme Polo era más completo.


Módulo actualizado: unittest
----------------------------

El módulo "unittest" se ha mejorado considerablemente y se han añadido
muchas funciones nuevas. La mayoría de estas funciones fueron
implementadas por Michael Foord, a menos que se indique lo contrario.
La versión mejorada del módulo se puede descargar por separado para su
uso con las versiones 2.4 a 2.6 de Python, empaquetada como el paquete
"unittest2", desde unittest2.

Cuando se usa desde la línea de comandos, el módulo puede descubrir
pruebas automáticamente. No es tan elegante como py.test o nose, pero
proporciona una forma sencilla de ejecutar pruebas guardadas dentro de
un conjunto de directorios de paquetes. Por ejemplo, el siguiente
comando buscará en el subdirectorio "test/" cualquier archivo de
prueba importable llamado "test*.py":

   python -m unittest descubre -s prueba

Consulte la documentación del módulo "unittest" para más detalles.
(Desarrollado en bpo-6001.)

La función "main()" soporta algunas otras opciones nuevas:

* "-b" o "--buffer" almacenará en búfer la salida estándar y los
  flujos de error estándar durante cada prueba. Si la prueba pasa, se
  descartará cualquier salida resultante; en caso de falla, se
  mostrará la salida almacenada en búfer.

* "-c" o "--catch" hará que la interrupción de control-C se maneje con
  más gracia.  En lugar de interrumpir el proceso de prueba
  inmediatamente, se completará la prueba que se esté ejecutando en
  ese momento y luego se informará de los resultados parciales hasta
  la interrupción. Si está impaciente, una segunda pulsación de
  control-C provocará una interrupción inmediata.</unittest>

  Este manejador de control-C intenta evitar que se produzcan
  problemas cuando el código que se está probando o las pruebas que se
  están ejecutando han definido un manejador de señales propio,
  advirtiendo que ya se ha establecido un manejador de señales y
  llamándolo.  Si esto no te funciona, hay un decorador
  "removeHandler()" que puede utilizarse para marcar las pruebas que
  deben tener el manejador de control-C desactivado.

* "-f" o "--failfast" hace que la ejecución de la prueba se detenga
  inmediatamente cuando una prueba falla en lugar de continuar
  ejecutando más pruebas.  (Sugerido por Cliff Dyer e implementado por
  Michael Foord; bpo-8074)</unittest>

Los mensajes de progreso ahora muestran 'x' para los fallos esperados
y 'u' para los éxitos inesperados cuando se ejecuta en modo verboso.
(Contribución de Benjamin Peterson)

Los casos de prueba pueden lanzar la excepción "SkipTest" para
saltarse una prueba (bpo-1034053).

Los mensajes de error para los fallos "assertEqual()", "assertTrue()",
y "assertFalse()" ahora proporcionan más información.  Si estableces
el atributo "longMessage" de tus clases "TestCase" a true, tanto el
mensaje de error estándar como cualquier mensaje adicional que
proporciones se imprimirán para los fallos.  (Añadido por Michael
Foord; bpo-5663.)

El método "assertRaises()" ahora retorna un manejador de contexto
cuando se llama sin proporcionar un objeto invocable para ejecutar.
Por ejemplo, puede escribir esto:

   with self.assertRaises(KeyError):
       {}['foo']

(Implementado por Antoine Pitrou; bpo-4444.)

Ahora se soportan las funciones de configuración y desmontaje a nivel
de módulo y de clase. Los módulos pueden contener funciones
"setUpModule()" y "tearDownModule()".  Las clases pueden tener métodos
"setUpClass()" y "tearDownClass()" que deben ser definidos como
métodos de clase (usando "@classmethod" o equivalente).  Estas
funciones y métodos se invocan cuando el ejecutor de pruebas cambia a
un caso de prueba en un módulo o clase diferente.

Se han añadido los métodos "addCleanup()" y "doCleanups()".
"addCleanup()" permite añadir funciones de limpieza que serán llamadas
incondicionalmente (después de "setUp()" si "setUp()" falla, en caso
contrario después de "tearDown()"). Esto permite una asignación y
desasignación de recursos mucho más sencilla durante las pruebas
(bpo-5679).

Se añadieron varios métodos nuevos que proporcionan pruebas más
especializadas.  Muchos de estos métodos fueron escritos por
ingenieros de Google para utilizarlos en sus conjuntos de pruebas;
Gregory P. Smith, Michael Foord y GvR trabajaron en la fusión de los
mismos en la versión de Python de "unittest".

* "assertIsNone()" y "assertIsNotNone()" toman una expresión y
  verifican que el resultado es o no es "None".

* "assertIs()" y "assertIsNot()" toman dos valores y comprueban si los
  dos valores se evalúan al mismo objeto o no. (Añadido por Michael
  Foord; bpo-2578.)

* "assertIsInstance()" y "assertNotIsInstance()" comprueban si el
  objeto resultante es una instancia de una clase concreta, o de una
  tupla de clases.  (Añadido por Georg Brandl; bpo-7031.)

* "assertGreater()", "assertGreaterEqual()", "assertLess()", y
  "assertLessEqual()" comparan dos cantidades.

* "assertMultiLineEqual()" compara dos cadenas, y si no son iguales,
  muestra una comparación útil que resalta las diferencias en las dos
  cadenas.  Esta comparación se utiliza ahora por defecto cuando las
  cadenas Unicode se comparan con "assertEqual()".

* "assertRegexpMatches()" y "assertNotRegexpMatches()" verifican si el
  primer argumento es una cadena que coincide o no con la expresión
  regular proporcionada como segundo argumento (bpo-8038).

* "assertRaisesRegexp()" verifica si se genera una excepción
  particular y luego también verifica que la representación de cadena
  de la excepción coincida con la expresión regular proporcionada.

* "assertIn()" y "assertNotIn()" comprueban si *primero* está o no
  está en *segundo*.

* "assertItemsEqual()" prueba si dos secuencias proporcionadas
  contienen los mismos elementos.

* "assertSetEqual()" compara si dos conjuntos son iguales, y sólo
  informa de las diferencias entre los conjuntos en caso de error.

* De forma similar, "assertListEqual()" y "assertTupleEqual()"
  comparan los tipos especificados y explican cualquier diferencia sin
  imprimir necesariamente sus valores completos; estos métodos se
  utilizan ahora por defecto cuando se comparan listas y tuplas
  utilizando "assertEqual()". De forma más general,
  "assertSequenceEqual()" compara dos secuencias y puede comprobar
  opcionalmente si ambas secuencias son de un tipo determinado.

* "assertDictEqual()" compara dos diccionarios e informa las
  diferencias; ahora se utiliza de forma predeterminada cuando se
  comparan dos diccionarios mediante "assertEqual()".
  "assertDictContainsSubset()" comprueba si todos los pares
  clave/valor de *first* se encuentran en *second*.

* "assertAlmostEqual()" y "assertNotAlmostEqual()" prueban si *first*
  y *second* son aproximadamente iguales. Este método puede redondear
  su diferencia a un número especificado opcionalmente de *lugares*
  (el valor predeterminado es 7) y compararlo con cero, o requerir que
  la diferencia sea menor que un valor *delta* proporcionado.

* "loadTestsFromName()" respeta correctamente el atributo "suiteClass"
  de la "TestLoader". (Corregido por Mark Roddy; bpo-6866.)

* Un nuevo hook permite extender el método "assertEqual()" para
  manejar nuevos tipos de datos.  El método "addTypeEqualityFunc()"
  toma un objeto de tipo y una función. La función se utilizará cuando
  los dos objetos que se comparan sean del tipo especificado.  Esta
  función debe comparar los dos objetos y lanzar una excepción si no
  coinciden; es una buena idea que la función proporcione información
  adicional acerca de por qué los dos objetos no coinciden, al igual
  que los nuevos métodos de comparación de secuencias.

"unittest.main()" ahora toma un argumento opcional "exit".  Si es
falso, "main()" no llama a "sys.exit()", permitiendo que "main()" sea
utilizado desde el intérprete interactivo. (Contribuido por J. Pablo
Fernández; bpo-3379.)

"TestResult" tiene nuevos métodos "startTestRun()" y "stopTestRun()"
que se llaman inmediatamente antes y después de la ejecución de una
prueba.  (Contribución de Robert Collins; bpo-5728.)

Con todos estos cambios, el archivo "unittest.py" se estaba volviendo
incómodamente grande, por lo que el módulo se convirtió en un paquete
y el código se dividió en varios archivos (por Benjamin Peterson).
Esto no afecta a la forma de importar o utilizar el módulo.

Ver también:

  https://web.archive.org/web/20210619163128/http://www.voidspace.org
  .uk/python/articles/unittest2.shtml
     Describe las nuevas funciones, cómo utilizarlas y la
     justificación de varias decisiones de diseño.  (Por Michael
     Foord.)


Módulo actualizado: ElementTree 1.3
-----------------------------------

La versión de la biblioteca ElementTree incluida en Python se ha
actualizado a la versión 1.3.  Algunas de las nuevas características
son:

* Las diversas funciones de análisis ahora toman un argumento de
  palabra clave *parser* que da una instancia de "XMLParser" que se
  utilizará.  Esto hace posible anular la codificación interna del
  archivo:

     p = ET.XMLParser(codificación='utf-8')
     t = ET.XML("""<root/>""", analizador=p)

  Los errores al analizar XML ahora generan una excepción
  "ParseError", cuyas instancias tienen un atributo "position" que
  contiene una tupla (*line*, *column*) que indica la ubicación del
  problema.

* ElementTree's code for converting trees to a string has been
  significantly reworked, making it roughly twice as fast in many
  cases.  The "ElementTree.write()" and "Element.write()" methods now
  have a *method* parameter that can be "xml" (the default), "html",
  or "text".  HTML mode will output empty elements as
  "<empty></empty>" instead of "<empty/>", and text mode will skip
  over elements and only output the text chunks.  If you set the "tag"
  attribute of an element to "None" but leave its children in place,
  the element will be omitted when the tree is written out, so you
  don't need to do more extensive rearrangement to remove a single
  element.

  Namespace handling has also been improved.  All "xmlns:<whatever>"
  declarations are now output on the root element, not scattered
  throughout the resulting XML.  You can set the default namespace for
  a tree by setting the "default_namespace" attribute and can register
  new prefixes with "register_namespace()".  In XML mode, you can use
  the true/false *xml_declaration* parameter to suppress the XML
  declaration.

* Nuevo método "Element": "extend()" añade los elementos de una
  secuencia a los hijos del elemento.  Los propios elementos se
  comportan como secuencias, por lo que es fácil mover los hijos de un
  elemento a otro:

     from xml.etree import ElementTree as ET

     t = ET.XML("""<list>
       <item>1</item> <item>2</item>  <item>3</item>
     </list>""")
     new = ET.XML('<root/>')
     new.extend(t)

     # Outputs <root><item>1</item>...</root>
     print ET.tostring(new)

* Nuevo método "Element": "iter()" genera los elementos secundarios
  del elemento como generador. También es posible escribir "for child
  in elem:" para recorrer los elementos secundarios de un elemento. El
  método existente "getiterator()" ya no se utiliza, al igual que
  "getchildren()", que construye y devuelve una lista de elementos
  secundarios.

* Nuevo método "Element": "itertext()" genera todos los fragmentos de
  texto que son descendientes del elemento. Por ejemplo:

     t = ET.XML("""<list>
       <item>1</item> <item>2</item>  <item>3</item>
     </list>""")

     # Outputs ['\n  ', '1', ' ', '2', '  ', '3', '\n']
     print list(t.itertext())

* Deprecado: el uso de un elemento como booleano (es decir, "if
  elem:") retornaba true si el elemento tenía algún hijo, o false si
  no había ningún hijo.  Este comportamiento es confuso -- "None" es
  falso, pero también lo es un elemento sin hijos? -- por lo que ahora
  provocará un "FutureWarning".  En tu código, deberías ser explícito:
  escribe "len(elem) != 0" si te interesa el número de hijos, o "elem
  no es None".

Fredrik Lundh desarrolla ElementTree y produjo la versión 1.3; puede
leer su artículo que describe 1.3 en https://web.archive.org/web/2020
0703234532/http://effbot.org/zone/elementtree-13-intro.htm. Florent
Xicluna actualizó la versión incluida con Python, luego de discusiones
en python-dev y en bpo-6472.)


Cambios en la API de construcción y C
=====================================

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

* La última versión del depurador GNU, GDB 7, puede ser scripted using
  Python. Cuando comience a depurar un programa ejecutable P, GDB
  buscará un archivo llamado "P-gdb.py" y lo leerá automáticamente.
  Dave Malcolm contribuyó con un "python-gdb.py" que agrega una serie
  de comandos útiles para depurar Python en sí. Por ejemplo, "py-up" y
  "py-down" suben o bajan un marco de pila de Python, que generalmente
  corresponde a varios marcos de pila de C. "py-print" imprime el
  valor de una variable de Python y "py-bt" imprime el seguimiento de
  la pila de Python. (Agregado como resultado de bpo-8032).

* Si utiliza el archivo ".gdbinit" proporcionado con Python, la macro
  "pyo" en la versión 2.7 ahora funciona correctamente cuando el hilo
  que se está depurando no tiene el GIL; la macro ahora lo adquiere
  antes de imprimir. (Contribución de Victor Stinner; bpo-3632.)

* "Py_AddPendingCall()" ahora es seguro para los hilos, permitiendo
  que cualquier hilo trabajador envíe notificaciones al hilo principal
  de Python.  Esto es particularmente útil para las operaciones
  asíncronas de IO. (Contribuido por Kristján Valur Jónsson;
  bpo-4293.)

* Nueva función: "PyCode_NewEmpty()" crea un objeto de código vacío;
  solo se requieren el nombre del archivo, el nombre de la función y
  el número de la primera línea. Esto resulta útil para los módulos de
  extensión que intentan construir una pila de seguimiento más útil.
  Anteriormente, dichas extensiones necesitaban llamar a
  "PyCode_New()", que tenía muchos más argumentos. (Agregado por
  Jeffrey Yasskin).

* Nueva función: "PyErr_NewExceptionWithDoc()" crea una nueva clase de
  excepción, igual que la existente "PyErr_NewException()", pero toma
  un argumento extra "char *" que contiene el docstring de la nueva
  clase de excepción.  (Añadido por 'lekma' en el bug tracker de
  Python; bpo-7033)

* Nueva función: "PyFrame_GetLineNumber()" toma un objeto frame y
  retorna el número de línea que el frame está ejecutando actualmente.
  Anteriormente, el código tenía que obtener el índice de la
  instrucción de código de bytes que se estaba ejecutando, y luego
  buscar el número de línea correspondiente a esa dirección.  (Añadido
  por Jeffrey Yasskin)

* Nuevas funciones: "PyLong_AsLongAndOverflow()" y
  "PyLong_AsLongLongAndOverflow()" aproximan un entero largo de Python
  como C long o long long. Si el número es demasiado grande para caber
  en el tipo de salida, se establece un indicador *overflow* y se
  devuelve a la persona que llama. (Aportado por Case Van Horsen;
  bpo-7528 y bpo-7767.)

* Nueva función: a partir de la reescritura de la conversión de cadena
  a flotante, se agregó una nueva función "PyOS_string_to_double()".
  Las antiguas funciones "PyOS_ascii_strtod()" y "PyOS_ascii_atof()"
  ahora están obsoletas.

* Nueva función: "PySys_SetArgvEx()" establece el valor de "sys.argv"
  y opcionalmente puede actualizar "sys.path" para incluir el
  directorio que contiene el script nombrado por "sys.argv[0]"
  dependiendo del valor de un parámetro *updatepath*.

  Esta función se agregó para cerrar un agujero de seguridad en las
  aplicaciones que incorporan Python. La función anterior,
  "PySys_SetArgv()", siempre actualizaba "sys.path" y, a veces, añadía
  el directorio actual. Esto significaba que, si ejecutaba una
  aplicación que incorporaba Python en un directorio controlado por
  otra persona, los atacantes podían colocar un módulo troyano en el
  directorio (por ejemplo, un archivo llamado "os.py") que su
  aplicación luego importaría y ejecutaría.

  Si mantiene una aplicación C/C++ que incorpora Python, verifique si
  está llamando a "PySys_SetArgv()" y considere cuidadosamente si la
  aplicación debería usar "PySys_SetArgvEx()" con *updatepath*
  establecido en falso.

  Problema de seguridad informado como **CVE 2008-5983**; discutido en
  bpo-5753 y solucionado por Antoine Pitrou.

* Nuevas macros: los ficheros de cabecera de Python definen ahora las
  siguientes macros: "Py_ISALNUM", "Py_ISALPHA", "Py_ISDIGIT",
  "Py_ISLOWER", "Py_ISSPACE", "Py_ISUPPER", "Py_ISXDIGIT",
  "Py_TOLOWER" y "Py_TOUPPER". Todas estas funciones son análogas a
  las macros estándar de C para clasificar caracteres, pero ignoran la
  configuración regional actual, porque en varios lugares Python
  necesita analizar los caracteres de forma independiente de la
  configuración regional.  (Añadido por Eric Smith; bpo-5793.)

* Función eliminada: "PyEval_CallObject()" ahora solo está disponible
  como macro. Se mantuvo una versión de función para preservar la
  compatibilidad con enlaces ABI, pero eso fue en 1997; por lo tanto,
  ya se puede eliminar. (Eliminada por Antoine Pitrou; bpo-8276).

* Nuevos códigos de formato: las funciones "PyString_FromFormat()",
  "PyString_FromFormatV()" y "PyErr_Format()" ahora aceptan los
  códigos de formato "%lld" y "%llu" para mostrar los tipos long long
  de C. (Contribuido por Mark Dickinson; bpo-7228.)

* Se ha cambiado la complicada interacción entre los hilos y la
  bifurcación de procesos.  Anteriormente, el proceso hijo creado por
  "os.fork()" podía fallar porque el hijo se creaba con un solo hilo
  en ejecución, el hilo que realizaba el "os.fork()". Si otros hilos
  estuvieran manteniendo un bloqueo, como el bloqueo de importación de
  Python, cuando se realizara el fork, el bloqueo seguiría marcado
  como "mantenido" en el nuevo proceso.  Pero en el proceso hijo nada
  liberaría el bloqueo, ya que los otros hilos no estaban replicados,
  y el proceso hijo ya no podría realizar importaciones.

  Python 2.7 adquiere el bloqueo de importación antes de realizar un
  "os.fork()", y también limpiará cualquier bloqueo creado usando el
  módulo "threading".  Los módulos de extensión C que tienen bloqueos
  internos, o que llaman a "fork()" ellos mismos, no se beneficiarán
  de esta limpieza.

  (Corregido por Thomas Wouters; bpo-1590864.)

* La función "Py_Finalize()" ahora llama a la función interna
  "threading._shutdown()"; esto evita que se generen algunas
  excepciones cuando se apaga un intérprete. (Parche de Adam Olsen;
  bpo-1722344).

* When using the "PyMemberDef" structure to define attributes of a
  type, Python will no longer let you try to delete or set a
  "T_STRING_INPLACE" attribute.

* Los símbolos globales definidos por el módulo "ctypes" llevan ahora
  el prefijo "Py", o bien "_ctypes".  (Implementado por Thomas Heller;
  bpo-3102.)

* Nueva opción de configuración: el conmutador "--with-system-expat"
  permite crear el módulo "pyexpat" para utilizar la biblioteca Expat
  del sistema. (Contribución de Arfrever Frehtes Taifersar Arahesis;
  bpo-7609).

* Nueva opción de configuración: la opción "--with-valgrind" ahora
  desactivará el asignador pymalloc, que es difícil de analizar
  correctamente por el detector de errores de memoria de Valgrind. Por
  lo tanto, Valgrind detectará mejor las fugas de memoria y los
  desbordamientos. (Contribución de James Henstridge; bpo-2422.)

* Nueva opción de configuración: ahora puede suministrar una cadena
  vacía a "--with-dbmliborder=" para desactivar todos los módulos DBM.
  (Añadido por Arfrever Frehtes Taifersar Arahesis; bpo-6491)

* The **configure** script now checks for floating-point rounding bugs
  on certain 32-bit Intel chips and defines a "X87_DOUBLE_ROUNDING"
  preprocessor definition.  No code currently uses this definition,
  but it's available if anyone wishes to use it. (Added by Mark
  Dickinson; bpo-2937.)

  **configure** also now sets a "LDCXXSHARED" Makefile variable for
  supporting C++ linking.  (Contributed by Arfrever Frehtes Taifersar
  Arahesis; bpo-1222585.)

* El proceso de construcción ahora crea los archivos necesarios para
  el soporte de pkg-config.  (Contribución de Clinton Roy; bpo-3585.)

* El proceso de construcción ahora soporta Subversion 1.7.
  (Contribuido por Arfrever Frehtes Taifersar Arahesis; bpo-6094.)


Cápsulas
--------

Python 3.1 añade un nuevo tipo de datos C, "PyCapsule", para
proporcionar una API C a un módulo de extensión.  Una cápsula es
esencialmente el soporte de un puntero C "void *", y está disponible
como un atributo del módulo; por ejemplo, la API del módulo "socket"
se expone como "socket.CAPI", y "unicodedata" expone "ucnhash_CAPI".
Otras extensiones pueden importar el módulo, acceder a su diccionario
para obtener el objeto cápsula, y luego obtener el puntero "void *",
que normalmente apuntará a una matriz de punteros a las diversas
funciones de la API del módulo.

Ya existe un tipo de datos que se utiliza para esto, "PyCObject", pero
no proporciona seguridad de tipos. Un código malicioso escrito en
Python puro podría provocar un error de segmentación al tomar un
"PyCObject" del módulo A y sustituirlo de alguna manera por el
"PyCObject" del módulo B. Las cápsulas conocen su propio nombre y,
para obtener el puntero, es necesario proporcionar el nombre:

   void *vtable;

   if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
           PyErr_SetString(PyExc_ValueError, "argument type invalid");
           return NULL;
   }

   vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");

Se asegura que "vtable" apunta a lo que se espera. Si se pasara una
cápsula diferente, "PyCapsule_IsValid()" detectaría el nombre erróneo
y retornaría false.  Consulta Proporcionar una API C para un módulo de
extensión para más información sobre el uso de estos objetos.

Python 2.7 ahora utiliza cápsulas internamente para proporcionar
varias API de módulos de extensión, pero se modificó
"PyCObject_AsVoidPtr()" para manejar cápsulas, lo que preserva la
compatibilidad en tiempo de compilación con la interfaz "PyCObject".
El uso de "PyCObject_AsVoidPtr()" indicará un
"PendingDeprecationWarning", que es silencioso de manera
predeterminada.

Implementado en Python 3.1 y portado a 2.7 por Larry Hastings;
discutido en bpo-5630.


Cambios específicos en los puertos: Windows
-------------------------------------------

* El módulo "msvcrt" ahora contiene algunas constantes del archivo de
  encabezado "crtassem.h": "CRT_ASSEMBLY_VERSION",
  "VC_ASSEMBLY_PUBLICKEYTOKEN" y "LIBRARIES_ASSEMBLY_NAME_PREFIX".
  (Contribuido por David Cournapeau; bpo-4365).

* El módulo "_winreg" para acceder al registro ahora implementa las
  funciones "CreateKeyEx()" y "DeleteKeyEx()", versiones extendidas de
  funciones admitidas anteriormente que toman varios argumentos
  adicionales. También se probaron y documentaron las funciones
  "DisableReflectionKey()", "EnableReflectionKey()" y
  "QueryReflectionKey()". (Implementado por Brian Curtin: bpo-7347).

* La nueva API "_beginthreadex()" se utiliza para iniciar subprocesos
  y ahora se utilizan las funciones nativas de almacenamiento local de
  subprocesos. (Contribución de Kristján Valur Jónsson; bpo-3582).

* La función "os.kill()" ahora funciona en Windows. El valor de la
  señal puede ser las constantes "CTRL_C_EVENT", "CTRL_BREAK_EVENT" o
  cualquier número entero. Las dos primeras constantes enviarán
  eventos de pulsación de teclas "Control"-"C" y "Control"-"Break" a
  los subprocesos; cualquier otro valor utilizará la API
  "TerminateProcess()". (Contribuido por Miki Tebeka; bpo-1220212.)

* La función "os.listdir()" ahora falla correctamente si la ruta está
  vacía.  (Corregido por Hirokazu Yamamoto; bpo-5913.)

* El módulo "mimetypes" ahora leerá la base de datos MIME del registro
  de Windows al inicializarse. (Parche de Gabriel Genellina;
  bpo-4969).


Cambios específicos en los puertos: Mac OS X
--------------------------------------------

* La ruta "/Library/Python/2.7/site-packages" se añade ahora a
  "sys.path", para compartir los paquetes añadidos entre la
  instalación del sistema y una copia de la misma versión instalada
  por el usuario. (Cambiado por Ronald Oussoren; bpo-4865.)

  Distinto en la versión 2.7.13: A partir de la versión 2.7.13, se ha
  eliminado este cambio. "/Library/Python/2.7/site-packages", el
  directorio site-packages utilizado por el sistema Python 2.7
  suministrado por Apple ya no se añade a "sys.path" para los Python
  instalados por el usuario, como los instaladores de python.org.  A
  partir de macOS 10.12, Apple ha cambiado la configuración del
  directorio site-packages del sistema, lo que puede hacer que falle
  la instalación de componentes pip, como setuptools.  Los paquetes
  instalados para el sistema Python ya no se compartirán con los
  Python instalados por el usuario. (bpo-28440)


Cambios específicos en los puertos: FreeBSD
-------------------------------------------

* La constante "SO_SETFIB" de FreeBSD 7.1, utilizada con los métodos
  "getsockopt()"/"setsockopt()" de "socket()" para seleccionar una
  tabla de enrutamiento alternativa, ahora está disponible en el
  módulo "socket". (Agregado por Kyle VanderBeek; bpo-8235.)


Otros cambios y correcciones
============================

* Dos scripts de evaluación, "iobench" y "ccbench", han sido añadidos
  al directorio "Tools". "iobench" mide la velocidad de los objetos de
  E/S de los archivos retornados por "open()" al realizar varias
  operaciones, y "ccbench" es una evaluación de concurrencia que trata
  de medir el rendimiento de la computación, la latencia del cambio de
  hilos y el ancho de banda del procesamiento de E/S al realizar
  varias tareas utilizando un número variable de hilos.

* El script "Tools/i18n/msgfmt.py" ahora entiende las formas plurales
  en los archivos ".po".  (Corregido por Martin von Löwis; bpo-5464.)

* Al importar un módulo desde un archivo ".pyc" o ".pyo" con un
  equivalente ".py" existente, los atributos "co_filename" de los
  objetos de código resultantes se sobrescriben cuando el nombre de
  archivo original queda obsoleto. Esto puede suceder si el archivo ha
  cambiado de nombre, se ha movido o se accede a él a través de rutas
  diferentes. (Parche de Ziga Seilnacht y Jean-Paul Calderone;
  bpo-1180193).

* El script "regrtest.py" ahora toma una opción "--randseed=" que toma
  un entero que será usado como semilla aleatoria para la opción "-r"
  que ejecuta las pruebas en orden aleatorio. La opción "-r" también
  informa de la semilla que se ha utilizado (Añadido por Collin
  Winter.)

* Otra opción "regrtest.py" es "-j", que toma un número entero que
  especifica cuántas pruebas se ejecutan en paralelo. Esto permite
  reducir el tiempo total de ejecución en máquinas multinúcleo. Esta
  opción es compatible con varias otras opciones, incluyendo la opción
  "-R" que es conocida por producir tiempos de ejecución largos.
  (Añadido por Antoine Pitrou, bpo-6152.) También puede utilizarse con
  una nueva opción "-F" que ejecuta las pruebas seleccionadas en un
  bucle hasta que fallen.  (Añadido por Antoine Pitrou; bpo-7312.)

* Cuando se ejecuta como un script, el módulo "py_compile.py" ahora
  acepta "'-'" como argumento, que leerá la entrada estándar para la
  lista de nombres de archivos a compilar.  (Contribuido por Piotr
  Ożarowski; bpo-8233.)


Adaptación a Python 2.7
=======================

Esta sección enumera los cambios descritos anteriormente y otras
correcciones de errores que pueden requerir cambios en su código:

* La función "range()" procesa sus argumentos de manera más
  consistente; ahora llamará a "__int__()" en los argumentos que no
  sean números flotantes ni enteros que se le proporcionen. (Corregido
  por Alexander Belopolsky; bpo-1533).

* El método string "format()" ha cambiado la precisión por defecto
  utilizada para los números de punto flotante y complejos de 6
  decimales a 12, que coincide con la precisión utilizada por "str()".
  (Cambiado por Eric Smith; bpo-5920.)

* Debido a una optimización de la declaración "with", los métodos
  especiales "__enter__()" y "__exit__()" deben pertenecer al tipo del
  objeto y no pueden adjuntarse directamente a la instancia del
  objeto. Esto afecta a las clases de nuevo estilo (derivadas de
  "object") y a los tipos de extensión de C. (bpo-6101).

* Debido a un error en Python 2.6, el parámetro *exc_value* de los
  métodos "__exit__()" era a menudo la representación de cadena de la
  excepción, no una instancia. Esto se solucionó en la versión 2.7,
  por lo que *exc_value* será una instancia como se esperaba.
  (Solucionado por Florent Xicluna; bpo-7853).

* Cuando se establecía un conjunto restringido de atributos utilizando
  "__slots__", la eliminación de un atributo no establecido no lanzaba
  "AttributeError" como cabría esperar.  Corregido por Benjamin
  Peterson; bpo-7604)

En la biblioteca estándar:

* Las operaciones con instancias "datetime" que daban como resultado
  un año que caía fuera del rango soportado no siempre lanzaban
  "OverflowError".  Estos errores se comprueban ahora con más cuidado
  y se lanzará la excepción. (Informado por Mark Leander, parche de
  Anand B. Pillai y Alexander Belopolsky; bpo-7150)

* Cuando se utilizan instancias "Decimal" con el método "format()" de
  una cadena, la alineación por defecto era antes la alineación a la
  izquierda.  Se ha cambiado a alineación derecha, lo que podría
  cambiar la salida de sus programas. (Cambiado por Mark Dickinson;
  bpo-6857.)

  Las comparaciones que implican un valor NaN de señalización (o
  "sNAN") señalan ahora "InvalidOperation" en lugar de retornar
  silenciosamente un valor verdadero o falso dependiendo del operador
  de comparación.  Los valores NaN silenciosos (o "NaN") son ahora
  hashable.  (Corregido por Mark Dickinson; bpo-7279.)

* La biblioteca "xml.etree.ElementTree" ya no omite los símbolos & y
  los corchetes angulares al generar una instrucción de procesamiento
  XML (que se parece a "<?xml-stylesheet href="#style1"?>") o un
  comentario (que se parece a "<!-- comment -->"). (Parche de Neil
  Muller; bpo-2746).

* El método "readline()" de los objetos "StringIO" ahora no hace nada
  cuando se solicita una longitud negativa, como lo hacen otros
  objetos similares a archivos. (bpo-7348).

* El módulo "syslog" utilizará ahora el valor de "sys.argv[0]" como
  identificador en lugar del anterior valor por defecto de "'python".
  (Cambiado por Sean Reifschneider; bpo-8451.)

* El manejo de errores por defecto del módulo "tarfile" ha cambiado,
  para no suprimir los errores fatales.  El nivel de error por defecto
  era antes 0, lo que significaba que los errores sólo daban lugar a
  que se escribiera un mensaje en el registro de depuración, pero como
  el registro de depuración no está activado por defecto, estos
  errores pasan desapercibidos.  El nivel de error por defecto es
  ahora 1, que lanza una excepción si hay un error. (Cambiado por Lars
  Gustäbel; bpo-7357.)

* El módulo "urlsplit()" del "urlparse" ahora maneja esquemas de URL
  desconocidos de una manera compatible con el **RFC 3986**: si la URL
  tiene el formato ""<something>://..."", el texto antes del "://" se
  trata como el esquema, incluso si es un esquema inventado que el
  módulo no conoce. Este cambio puede romper el código que funcionaba
  con el comportamiento anterior. Por ejemplo, Python 2.6.4 o 2.5
  devolverá lo siguiente:

     >>> import urlparse
     >>> urlparse.urlsplit('invented://host/nombre_archivo?consulta')
     ('invented', '', '//host/nombre_archivo?consulta', '', '')

  Python 2.7 (y Python 2.6.5) retornará:

     >>> import urlparse
     >>> urlparse.urlsplit('invented://host/filename?query')
     ('invented', 'host', '/filename?query', '', '')

  (Python 2.7 en realidad produce una salida ligeramente diferente, ya
  que retorna una tupla con nombre en lugar de una tupla estándar)

Para las extensiones en C:

* Las extensiones de C que utilizan códigos de formato entero con la
  familia de funciones "PyArg_Parse*" ahora lanzarán una excepción
  "TypeError" en lugar de provocar un "DeprecationWarning" (bpo-5080).

* Utilice la nueva función "PyOS_string_to_double()" en lugar de las
  antiguas funciones "PyOS_ascii_strtod()" y "PyOS_ascii_atof()", que
  ahora están obsoletas.

Para aplicaciones que incrustan Python:

* Se agregó la función "PySys_SetArgvEx()", que permite a las
  aplicaciones cerrar un agujero de seguridad cuando se utiliza la
  función "PySys_SetArgv()" existente. Verifique si está llamando a
  "PySys_SetArgv()" y considere cuidadosamente si la aplicación
  debería usar "PySys_SetArgvEx()" con *updatepath* configurado como
  falso.


Nuevas funciones añadidas a las versiones de mantenimiento de Python 2.7
========================================================================

Se pueden añadir nuevas características a las versiones de
mantenimiento de Python 2.7 cuando la situación lo requiera realmente.
Cualquier adición debe pasar por el proceso de Propuesta de Mejora de
Python, y hacer un caso convincente de por qué no se puede abordar
adecuadamente mediante la adición de la nueva característica
únicamente a Python 3, o bien mediante su publicación en el Índice de
Paquetes de Python.

Además de las propuestas específicas enumeradas a continuación, existe
una exención general que permite añadir nuevas advertencias "-3" en
cualquier versión de mantenimiento de Python 2.7.


Dos nuevas variables de entorno para el modo de depuración
----------------------------------------------------------

En el modo de depuración, la estadística "[xxx refs]" no se escribe de
manera predeterminada; ahora también se debe configurar la variable de
entorno "PYTHONSHOWREFCOUNT". (Contribución de Victor Stinner;
bpo-31733).

Cuando Python se compila con "COUNT_ALLOC" definido, los recuentos de
asignación ya no se vuelcan de forma predeterminada: ahora también se
debe configurar la variable de entorno "PYTHONSHOWALLOCCOUNT". Además,
los recuentos de asignación ahora se vuelcan en stderr, en lugar de
stdout. (Contribuido por Victor Stinner; bpo-31692).

Added in version 2.7.15.


PEP 434: Excepción de mejora de IDLE para todas las ramas
---------------------------------------------------------

**PEP 434** describe una exención general para los cambios realizados
en el entorno de desarrollo de IDLE que se envía junto con Python.
Esta exención hace posible que los desarrolladores de IDLE
proporcionen una experiencia de usuario más consistente en todas las
versiones soportadas de Python 2 y 3.

Para conocer los detalles de los cambios de IDLE, consulte el archivo
NEWS de la versión en cuestión.


PEP 466: Mejoras en la seguridad de la red para Python 2.7
----------------------------------------------------------

**PEP 466** describe una serie de propuestas de mejora de la seguridad
de la red que han sido aprobadas para su inclusión en las versiones de
mantenimiento de Python 2.7, y el primero de esos cambios aparecerá en
la versión 2.7.7 de Python.

Funciones relacionadas con *466* añadidas en Python 2.7.7:

* "hmac.compare_digest()" fue portado desde Python 3 para hacer una
  operación de comparación resistente a los ataques de tiempo
  disponible para las aplicaciones de Python 2. (Contribuido por Alex
  Gaynor; bpo-21306.)

* OpenSSL 1.0.1g fue actualizado en los instaladores oficiales de
  Windows publicados en python.org. (Contribuido por Zachary Ware;
  bpo-21462.)

Funciones relacionadas con *466* añadidas en Python 2.7.8:

* "hashlib.pbkdf2_hmac()" fue portado desde Python 3 para hacer que un
  algoritmo de hash adecuado para el almacenamiento seguro de
  contraseñas esté ampliamente disponible para las aplicaciones de
  Python 2. (Contribuido por Alex Gaynor; bpo-21304.)

* OpenSSL 1.0.1h se actualizó para los instaladores oficiales de
  Windows publicados en python.org. (Contribución de Zachary Ware en
  bpo-21671 para **CVE 2014-0224**.)

Funciones relacionadas con *466* añadidas en Python 2.7.9:

* La mayor parte del módulo "ssl" de Python 3.4 ha sido portado a esta
  versión. Esto significa que "ssl" ahora soporta la Indicación de
  Nombre de Servidor, la configuración de TLS1.x, el acceso al almacén
  de certificados de la plataforma, la clase "SSLContext", y otras
  características. (Contribución de Alex Gaynor y David Reid;
  bpo-21308.)

  Consulte las notas "Versión añadida: 2.7.9" en la documentación del
  módulo para obtener detalles específicos.

* "os.urandom()" ha sido modificado para almacenar en caché un
  descriptor de fichero en "/dev/urandom" en lugar de reabrir
  "/dev/urandom" en cada llamada. (Contribuido por Alex Gaynor;
  bpo-21305.)

* "hashlib.algorithms_guaranteed" y "hashlib.algorithms_available" han
  sido portados desde Python 3 para facilitar a las aplicaciones de
  Python 2 la selección del algoritmo hash más potente disponible.
  (Contribuido por Alex Gaynor en bpo-21307)


PEP 477: Backport ensurepip (PEP 453) a Python 2.7
--------------------------------------------------

**PEP 477** aprueba la inclusión del módulo **PEP 453** ensurepip y la
documentación mejorada que ha permitido en las versiones de
mantenimiento de Python 2.7, apareciendo primero en la versión 2.7.9
de Python.


Puesta en marcha de pip por defecto
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

El nuevo módulo "ensurepip" (definido en **PEP 453**) proporciona un
mecanismo estándar multiplataforma para arrancar el instalador pip en
las instalaciones de Python. La versión de "pip" incluida con Python
2.7.9 es "pip" 1.5.6, y las futuras versiones de mantenimiento de
2.7.x actualizarán la versión incluida a la última versión de "pip"
que esté disponible en el momento de crear la versión candidata.

Por defecto, los comandos "pip", "pipX" y "pipX.Y" se instalarán en
todas las plataformas (donde X.Y representa la versión de la
instalación de Python), junto con el paquete de Python "pip" y sus
dependencias.

Para las construcciones de CPython source en sistemas POSIX, los
comandos "make install" y "make altinstall" no arrancan "pip" por
defecto.  Este comportamiento puede ser controlado a través de las
opciones de configuración, y anulado a través de las opciones del
Makefile.</building-python-on-unix>

En Windows y Mac OS X, los instaladores de CPython ahora instalan por
defecto "pip" junto con el propio CPython (los usuarios pueden optar
por no instalarlo durante el proceso de instalación). Los usuarios de
Windows tendrán que optar por las modificaciones automáticas del
"PATH" para que "pip" esté disponible por defecto desde la línea de
comandos, de lo contrario se puede acceder a través del lanzador de
Python para Windows como "py -m pip".

Como en **discussed in the PEP**, los empaquetadores de plataformas
pueden elegir no instalar estos comandos de forma predeterminada,
siempre que, cuando se invoquen, proporcionen instrucciones claras y
simples sobre cómo instalarlos en esa plataforma (generalmente usando
el administrador de paquetes del sistema).


Cambios en la documentación
~~~~~~~~~~~~~~~~~~~~~~~~~~~

Como parte de este cambio, las secciones Instalando módulos de Python
y Distribuir módulos de Python de la documentación se han rediseñado
por completo como documentos breves de introducción y preguntas
frecuentes. La mayor parte de la documentación de empaquetado ahora se
ha trasladado a Python Packaging Authority mantenido Python Packaging
User Guide y la documentación de los proyectos individuales.

Sin embargo, como esta migración aún no está completa, las versiones
anteriores de esas guías siguen estando disponibles como Building C
and C++ Extensions with setuptools y Building C and C++ Extensions
with setuptools.

Ver también:

  **PEP 453** -- Arranque explícito de pip en instalaciones de Python
     PEP escrito por Donald Stufft y Nick Coghlan, implementado por
     Donald Stufft, Nick Coghlan, Martin von Löwis y Ned Deily.


PEP 476: Habilitar la verificación de certificados por defecto para los clientes http stdlib
--------------------------------------------------------------------------------------------

**PEP 476** actualizó "httplib" y los módulos que lo utilizan, como
"urllib2" y "xmlrpclib", para verificar que el servidor presente un
certificado firmado por una autoridad de certificación en el almacén
de confianza de la plataforma y cuyo nombre de host coincida con el
nombre de host que se solicita de manera predeterminada, lo que mejora
significativamente la seguridad para muchas aplicaciones. Este cambio
se realizó en la versión Python 2.7.9.

Para las aplicaciones que requieren el antiguo comportamiento
anterior, pueden pasar un contexto alternativo:

   import urllib2
   import ssl

   # This disables all verification
   context = ssl._create_unverified_context()

   # This allows using a specific certificate for the host, which doesn't need
   # to be in the trust store
   context = ssl.create_default_context(cafile="/path/to/file.crt")

   urllib2.urlopen("https://invalid-cert", context=context)


PEP 493: Herramientas de migración de verificación HTTPS para Python 2.7
------------------------------------------------------------------------

**PEP 493** proporciona herramientas de migración adicionales para
soportar un proceso de actualización de la infraestructura más
incremental para los entornos que contienen aplicaciones y servicios
que dependen del procesamiento históricamente permisivo de los
certificados de servidor cuando se establecen conexiones HTTPS de
cliente.  Estas adiciones se realizaron en la versión 2.7.12 de
Python.

Estas herramientas están pensadas para su uso en casos en los que las
aplicaciones y servicios afectados no pueden modificarse para pasar
explícitamente un contexto SSL más permisivo al establecer la
conexión.

Para las aplicaciones y servicios que no pueden ser modificados en
absoluto, la nueva variable de entorno "PYTHONHTTPSVERIFY" puede
establecerse a "0" para revertir todo un proceso de Python al
comportamiento permisivo por defecto de Python 2.7.8 y anteriores.

Para los casos en los que no se puede modificar el código de
establecimiento de conexión, pero sí la aplicación general, se puede
utilizar la nueva función "ssl._https_verify_certificates()" para
ajustar el comportamiento predeterminado en tiempo de ejecución.


Nuevo objetivo de construcción "make regen-all"
-----------------------------------------------

Para simplificar la compilación cruzada, y para asegurar que CPython
pueda ser compilado de forma fiable sin requerir que una versión
existente de Python esté ya disponible, el sistema de construcción
basado en autotools ya no intenta recompilar implícitamente los
archivos generados basándose en los tiempos de modificación de los
archivos.

En su lugar, se ha añadido un nuevo comando "make regen-all" para
forzar la regeneración de estos archivos cuando se desee (por ejemplo,
después de que se haya construido una versión inicial de Python basada
en las versiones pregeneradas).

También se definen objetivos de regeneración más selectivos - ver
Makefile.pre.in para más detalles.

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

Added in version 2.7.14.


Eliminación del objetivo de construcción "make touch"
-----------------------------------------------------

Se ha eliminado el objetivo de compilación "make touch" que
anteriormente se utilizaba para solicitar la regeneración implícita de
los archivos generados mediante la actualización de sus tiempos de
modificación.

Se ha sustituido por el nuevo objetivo "make regen-all".

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

Distinto en la versión 2.7.14.


Agradecimientos
===============

El autor desea agradecer a las siguientes personas sus sugerencias,
correcciones y ayuda en varios borradores de este artículo: Nick
Coghlan, Philip Jenvey, Ryan Lovett, R. David Murray y Hugh Secker-
Walker.
