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 flotantex
es más corto en muchos casos: ahora se basa en la cadena decimal más corta que se garantiza que redondea ax
. Como en versiones anteriores de Python, se garantiza quefloat(repr(x))
retornex
.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()
yoperator.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()
paracollections.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ódulojson
se amplió con un parámetro object_pairs_hook para permitir que el decodificador construya instanciasOrderedDict
. 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ónLa página de documentación del módulo argparse.
- Upgrading optparse code
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 seasocket.SOCK_DGRAM
para UDP osocket.SOCK_STREAM
para TCP. El protocolo predeterminado sigue siendo UDP.Las instancias
Logger
ganaron un métodogetChild()
que recupera un registrador descendiente mediante una ruta de acceso relativa. Por ejemplo, una vez que se recupera un registrador haciendolog = getLogger('app')
, llamandolog.getChild('network.listen')
es equivalente agetLogger('app.network.listen')
.La clase
LoggerAdapter
obtuvo un métodoisEnabledFor()
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()
.
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')
>>>
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; useset()
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ónwith
. 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 constructoresfloat
ycomplex
; formato numérico; serializar y deserializar flotantes y números complejos usando los módulosmarshal
,pickle
yjson
; análisis de literales flotantes e imaginarios en código Python; y conversiónDecimal
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 ylegacy
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 destr.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 destr.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 resultante1,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 unPendingDeprecationWarning
si se le pasa una cadena de formato, porque el método__format__()
paraobject
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()
ylong()
obtuvieron un métodobit_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 instruccionesimport
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 tipobytearray
ahora aceptaNone
como primer argumento. (Corregido por Georg Brandl; bpo-4759.)Al utilizar
@classmethod
y@staticmethod
para encapsular métodos como métodos de clase o estáticos, el objeto encapsulador ahora expone la función encapsulada como su atributo__func__
. (Contribuido por Amaury Forgeot d’Arc, a partir de una sugerencia de George Sakkis; bpo-5982).Cuando se establecía un conjunto restringido de atributos utilizando
__slots__
, la eliminación de un atributo no establecido no lanzabaAttributeError
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 atributofilename
en la excepciónIOError
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()
yrsplit()
de tipos similares a cadenas (cadenas, cadenas Unicode y objetosbytearray
) 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
ycPickle
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 comodjango.*
; 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 dememoryview
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
deBZ2File
ahora soporta el protocolo de gestión de contexto, por lo que se puede escribircon bz2.BZ2File(...) como f:
. (Contribución de Hagen Fürstenau; bpo-3860.)Nueva clase: la clase
Counter
del módulocollections
es útil para el recuento de datos. Las instancias deCounter
se comportan mayoritariamente como los diccionarios, pero retornan cero si faltan claves en lugar de lanzar unKeyError
:>>> 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 otraCounter
, 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étodocount()
que retorna el número de elementos contenidos igual al argumento suministrado x, y un métodoreverse()
que invierte los elementos del deque en su lugar.deque
también expone su longitud máxima como el atributo de sólo lecturamaxlen
. (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 devuelveNotImplemented
si se compara una asignación con otro tipo que no esMapping
. (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ónwith
, ha quedado obsoleta, porque la declaraciónwith
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ódulocopy
ahora copiará correctamente los métodos de instancia vinculados. (Implementado por Robert Collins; bpo-1515.)El módulo
ctypes
ahora convierte siempreNone
a un puntero CNULL
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ódulodatetime
ha ganado un métodototal_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 clasefrom_float()
que realiza una conversión exacta de un número de punto flotante a unDecimal
. 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)
devuelveDecimal('0.1000000000000000055511151231257827021181583404541015625')
. (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 combinarDecimal
y punto flotante en otras operaciones como la suma, ya que debe elegir explícitamente cómo convertir entre float yDecimal
. (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 deDecimal
; las únicas excepciones son los métodoscanonical()
yis_canonical()
. (Parche de Juan José Conti; bpo-7633.)Cuando se utilizan instancias
Decimal
con el métodoformat()
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 ahoraInvalidOperation
en lugar de retornar silenciosamente un valor verdadero o falso dependiendo del operador de comparación. Los valores NaN silenciosos (oNaN
) 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 archivoMANIFEST
, ya que aunque los archivosMANIFEST.in
osetup.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ódulodoctest
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óduloemail
ahora aceptará una carga útil con valor Unicode y convertirá automáticamente la carga útil a la codificación especificada poroutput_charset
. (Agregado por R. David Murray; bpo-1368247).La clase
Fraction
acepta ahora una instancia de float oDecimal
, 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 unTypeError
. Esto corrige un descuido, haciendo que laFraction
coincida con los otros tipos numéricos.Nueva clase:
FTP_TLS
en el móduloftplib
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ódulofunctools
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 comosorted()
,min()
ymax()
, 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ódulois_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 escribircon gzip.GzipFile(...) como f:
(contribución de Hagen Fürstenau; bpo-3860), y ahora implementa el ABC deio.BufferedIOBase
, por lo que se puede envolver conio.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 atributoalgorithms
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ódulohttplib
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
yHTTPSConnection
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 queihooks
es un módulo más antiguo para personalizar importaciones, reemplazado por el móduloimputil
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óduloinspect
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 atributoerrors
que proporciona la configuración de error utilizada para codificar y decodificar errores (uno de'strict'
,'replace'
,'ignore'
).La clase
io.FileIO
ahora lanza unOSError
cuando se le pasa un descriptor de fichero no válido. (Implementado por Benjamin Peterson; bpo-4991.) El métodotruncate()
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 decombinations()
, 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 deDecimal
. (Implementado por Raymond Hettinger; bpo-5032.)itertools.combinaciones()
yitertools.producto()
anteriormente lanzabanValueError
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óduloMaildir
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()
yerfc()
para la función de error y la función de error complementaria,expm1()
que calculae**x - 1
con más precisión que usandoexp()
y restando 1,gamma()
para la función Gamma, ylgamma()
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ódulomultiprocessing
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á quePool
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()
ygetresuid()
, que retornan los GIDs y UIDs reales, efectivos y guardados;setresgid()
ysetresuid()
, 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 cuandofork()
se llama desde un hilo. (Corregido por Zsolt Cserna; bpo-7242.)En el módulo
os.path
, las funcionesnormpath()
yabspath()
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 hacerhelp('<<')
ohelp('@')
, por ejemplo. (Contribución de David Laban; bpo-4739.)Las funciones
re
del módulosplit()
,sub()
ysubn()
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ódulorunpy
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 desys.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 ensys.path
. Esto hace que más de la maquinaria derunpy
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()
ycopytree()
ahora lanzan una excepciónSpecialFileError
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 ygetuserbase()
devuelve el valor de la variable de entornoUSER_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ódulositecustomize
, y ya no atrapará y tragará la excepciónKeyboardInterrupt
. (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()
yrecvfrom_into()
ahora escribirán en objetos que soporten la API de búfer, más útilmente los objetosbytearray
ymemoryview
. (Implementado por Antoine Pitrou; bpo-8104.)La clase
TCPServer
del móduloSocketServer
ahora admite tiempos de espera de socket y la desactivación del algoritmo Nagle. El atributo de clasedisable_nagle_algorithm
tiene como valor predeterminadoFalse
; 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 clasetimeout
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á ahandle_timeout()
yhandle_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étodoenable_load_extension(True)
para habilitar las extensiones, y luego llame aload_extension()
para cargar una biblioteca compartida en particular. (Actualizado por Gerhard Häring.)Los objetos
SSLSocket
del módulossl
ahora admiten la API de búfer, que solucionó una falla del conjunto de pruebas (solución de Antoine Pitrou; bpo-7133) y configuró automáticamenteSSL_MODE_AUTO_RETRY
de OpenSSL, lo que evitará que se devuelva un código de error de las operacionesrecv()
que activan una renegociación de SSL (solución de 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) yssl.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 debBhHiIlLqQ
); ahora siempre genera una excepciónstruct.error
. (Modificado por Mark Dickinson; bpo-1523). La funciónpack()
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ódulosubprocess
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ónCalledProcessError
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ñalEINTR
. (Varias personas lo informaron; parche final de Gregory P. Smith en bpo-1068268).Nueva función:
is_declared_global()
en el módulosymtable
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 desys.argv[0]
como identificador en lugar del anterior valor por defecto de'python
. (Cambiado por Sean Reifschneider; bpo-8451.)El valor
sys.version_info
ahora es una tupla con nombre, con atributos denominadosmajor
,minor
,micro
,releaselevel
yserial
. (Contribuido por Ross Light; bpo-4285).sys.getwindowsversion()
también devuelve una tupla con nombre, con atributos denominadosmajor
,minor
,build
,platform
,service_pack
,service_pack_major
,service_pack_minor
,suite_mask
yproduct_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 objetosTarInfo
que se añaden a un fichero tar. Cuando llame aadd()
, puede suministrar un argumento opcional filtro que es una llamada. Al filtro se le pasará la claseTarInfo
de cada fichero que se añada, y podrá modificarlo y retornarlo. Si la llamada retornaNada
, 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 claseTarFile
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 clasethreading.Event
ahora retorna la bandera interna al salir. Esto significa que el método normalmente retornará true porquewait()
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 datosUnihan.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()
delurlparse
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óduloweakref
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
ySimpleXMLRPCServer
, 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 atributoencode_threshold
deSimpleXMLRPCRequestHandler
, 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
deZipFile
soporta ahora el protocolo de gestión de contexto, por lo que se puede escribircon 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 deread()
yreadline()
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 constructorZipFile
. (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 ficheropyconfig.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()
yassertIsNotNone()
toman una expresión y verifican que el resultado es o no esNone
.assertIs()
yassertIsNot()
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()
yassertNotIsInstance()
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()
, yassertLessEqual()
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 conassertEqual()
.assertRegexpMatches()
yassertNotRegexpMatches()
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()
yassertNotIn()
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()
yassertTupleEqual()
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 utilizandoassertEqual()
. 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 medianteassertEqual()
.assertDictContainsSubset()
comprueba si todos los pares clave/valor de first se encuentran en second.assertAlmostEqual()
yassertNotAlmostEqual()
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 atributosuiteClass
de laTestLoader
. (Corregido por Mark Roddy; bpo-6866.)Un nuevo hook permite extender el método
assertEqual()
para manejar nuevos tipos de datos. El métodoaddTypeEqualityFunc()
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 atributoposition
que contiene una tupla (line, column) que indica la ubicación del problema.El código de ElementTree para convertir árboles en cadenas ha sido rediseñado significativamente, lo que lo hace aproximadamente el doble de rápido en muchos casos. Los métodos
ElementTree.write()
yElement.write()
ahora tienen un parámetro method que puede ser «xml» (el valor predeterminado), «html» o «texto». El modo HTML mostrará los elementos vacíos como<empty></empty>
en lugar de<empty/>
, y el modo de texto omitirá los elementos y solo mostrará los fragmentos de texto. Si establece el atributotag
de un elemento enNone
pero deja sus elementos secundarios en su lugar, el elemento se omitirá cuando se escriba el árbol, por lo que no necesita realizar una reorganización más extensa para eliminar un solo elemento.También se ha mejorado la gestión de los espacios de nombres. Ahora todas las declaraciones
xmlns:<whatever>
se emiten en el elemento raíz, y no dispersas en el XML resultante. Se puede establecer el espacio de nombres por defecto para un árbol mediante el atributodefault_namespace
y se pueden registrar nuevos prefijos conregister_namespace()
. En el modo XML, puede utilizar el parámetro true/false xml_declaration para suprimir la declaración XML.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 escribirfor child in elem:
para recorrer los elementos secundarios de un elemento. El método existentegetiterator()
ya no se utiliza, al igual quegetchildren()
, 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á unFutureWarning
. En tu código, deberías ser explícito: escribelen(elem) != 0
si te interesa el número de hijos, oelem 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/20200703234532/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 unpython-gdb.py
que agrega una serie de comandos útiles para depurar Python en sí. Por ejemplo,py-up
ypy-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 ypy-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 aPyCode_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 existentePyErr_NewException()
, pero toma un argumento extrachar *
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()
yPyLong_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 funcionesPyOS_ascii_strtod()
yPyOS_ascii_atof()
ahora están obsoletas.Nueva función:
PySys_SetArgvEx()
establece el valor desys.argv
y opcionalmente puede actualizarsys.path
para incluir el directorio que contiene el script nombrado porsys.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 actualizabasys.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 llamadoos.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 usarPySys_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
yPy_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()
yPyErr_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 elos.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ódulothreading
. Los módulos de extensión C que tienen bloqueos internos, o que llaman afork()
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 internathreading._shutdown()
; esto evita que se generen algunas excepciones cuando se apaga un intérprete. (Parche de Adam Olsen; bpo-1722344).Al utilizar la estructura
PyMemberDef
para definir atributos de un tipo, Python ya no le permitirá intentar eliminar o establecer un atributoT_STRING_INPLACE
.Los símbolos globales definidos por el módulo
ctypes
llevan ahora el prefijoPy
, o bien_ctypes
. (Implementado por Thomas Heller; bpo-3102.)Nueva opción de configuración: el conmutador
--with-system-expat
permite crear el módulopyexpat
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)El script configure comprueba ahora los errores de redondeo en coma flotante en ciertos chips Intel de 32 bits y define una definición del preprocesador
X87_DOUBLE_ROUNDING
. Ningún código utiliza actualmente esta definición, pero está disponible si alguien desea utilizarla. (Añadido por Mark Dickinson; bpo-2937.)configure ahora también establece una variable Makefile
LDCXXSHARED
para soportar el enlazado de C++. (Contribuido por 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 encabezadocrtassem.h
:CRT_ASSEMBLY_VERSION
,VC_ASSEMBLY_PUBLICKEYTOKEN
yLIBRARIES_ASSEMBLY_NAME_PREFIX
. (Contribuido por David Cournapeau; bpo-4365).El módulo
_winreg
para acceder al registro ahora implementa las funcionesCreateKeyEx()
yDeleteKeyEx()
, versiones extendidas de funciones admitidas anteriormente que toman varios argumentos adicionales. También se probaron y documentaron las funcionesDisableReflectionKey()
,EnableReflectionKey()
yQueryReflectionKey()
. (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 constantesCTRL_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 APITerminateProcess()
. (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 asys.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 asys.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étodosgetsockopt()
/setsockopt()
desocket()
para seleccionar una tabla de enrutamiento alternativa, ahora está disponible en el módulosocket
. (Agregado por Kyle VanderBeek; bpo-8235.)
Otros cambios y correcciones¶
Dos scripts de evaluación,
iobench
yccbench
, han sido añadidos al directorioTools
.iobench
mide la velocidad de los objetos de E/S de los archivos retornados poropen()
al realizar varias operaciones, yccbench
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 atributosco_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 porstr()
. (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 deobject
) 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 lanzabaAttributeError
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 lanzabanOverflowError
. 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étodoformat()
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 ahoraInvalidOperation
en lugar de retornar silenciosamente un valor verdadero o falso dependiendo del operador de comparación. Los valores NaN silenciosos (oNaN
) 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 objetosStringIO
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 desys.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()
delurlparse
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ónTypeError
en lugar de provocar unDeprecationWarning
(bpo-5080).Utilice la nueva función
PyOS_string_to_double()
en lugar de las antiguas funcionesPyOS_ascii_strtod()
yPyOS_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ónPySys_SetArgv()
existente. Verifique si está llamando aPySys_SetArgv()
y considere cuidadosamente si la aplicación debería usarPySys_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 quessl
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 claseSSLContext
, 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
yhashlib.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.