Qué hay de nuevo en Python 3.3¶
Éste artículo explica las nuevas características en python 3.3, en comparación con la versión 3.2. Python 3.3 se lanzó el 29 de septiembre de 2012. Para más detalles, ver el log de cambios en la dirección <https://docs.python.org/3.3/whatsnew/changelog.html>.
Ver también
PEP 398 - Calendario de Publicación Python 3.3
Resumen – Aspectos destacados de la versión¶
Nuevas características de sintaxis:
Nueva expresión
yield from
para delegación de generadores.La sintaxis
u'unicode'
se acepta de nuevo para los objetosstr
.
Nuevos módulos de biblioteca:
faulthandler
(ayuda a depurar bloqueos de bajo nivel)ipaddress
(Objetos de alto nivel que representan direcciones IP y máscaras)lzma
(comprime datos usando el algoritmo XZ / LZMA)unittest.mock
(Utiliza objetos que simulen partes de tu sistema en ambiente de pruebas)venv
(Python entornos virtuales, como en el paquete original Virtualenv)
Nuevas características incorporadas:
Se reformula la Jerarquía de excepción I/O .
Mejoras de implementación:
Se reescribe Maquinaria de importación con base en
importlib
.cadenas de caracteres unicode más compactas.
diccionarios de atributos más compactos.
Módulos de biblioteca con mejoras significativas:
Acelerador de C para el módulo decimal .
Mejor gestión de unicode en el módulo email (provisional).
Mejoras de seguridad:
La aleatoriedad en los hash está habilitada de forma predeterminada.
Por favor continúa leyendo para obtener una lista completa de los cambios de cara al usuario.
PEP 405: Entornos virtuales¶
Los entornos virtuales ayudan a crear configuraciones separadas de Python mientras comparten una instalación base en todo el sistema, para facilitar el mantenimiento. Los entornos virtuales tienen su propio conjunto de paquetes de sitios privados (es decir, bibliotecas instaladas localmente) y están opcionalmente segregados de los paquetes de sitios de todo el sistema. Su concepto e implementación están inspirados en el popular paquete de terceros virtualenv
, pero se benefician de una integración más estrecha con el núcleo del intérprete.
Este PEP agrega el módulo venv
para acceso programático, y el script pyvenv
para administración y acceso a través de línea de comandos. El intérprete de python busca un archivo llamado pyvenv.cfg
, cuya existencia señala la base de un árbol de directorios en el entorno virtual.
Ver también
- PEP 405 - Entornos virtuales en python
PEP escrito por Carl Meyer; implementación por Carl Meyer y Vinay Sajip
PEP 420: Paquetes para espacios de nombres implícitos¶
Soporte nativo para directorios de paquetes que no requieran el archivo __init.py__
y puedan abarcar automáticamente múltiples segmentos de rutas de acceso (Inspirado en varios enfoques de terceros para espacios de nombres de paquetes, tal como está especificado en PEP 420)
Ver también
- PEP 420 - Paquetes de espacio de nombres implícitos
PEP escrito por Eric V. Smith; implementación por Eric V. Smith y Barry Warsaw
PEP 3118: Nueva implementación de vista de memoria y en la documentación del protocolo del buffer¶
La implementación del PEP 3118 ha tenido mejoras significativas.
La nueva implementación de la vista de memoria corrige exhaustivamente todos los problemas de propiedad y duración de los campos asignados dinámicamente en la estructura de Py_buffer que ha dado lugar a varios informes de bloqueo. Además, se han corregido varias funciones que se bloquearon o retornaron resultados incorrectos para entradas no contigua o multidimensional.
El objeto de vista de memoria dispone ahora de PEP-3118 que obedece a getbufferproc(), el cual verifica el tipo de petición del cliente. Se han agregado nuevas características, la mayoría de ellas funcionan generalmente para arrays no contiguos y arrays con subindices.
La documentación se ha actualizado y se han establecido claramente las responsabilidades tanto para los exportadores como para los consumidores. Los indicadores de solicitud de buffer se agrupan en indicadores básicos y compuestos. Se explica el diseño de memoria de matrices de estilo NumPy no contiguas y multidimensionales.
Características¶
Ahora se admiten todos los especificadores nativos de formato de un solo carácter en la sintaxis del módulo de estructura (opcionalmente con el prefijo “@”).
Con algunas reestricciones, el método cast() permite cambiar el formato y forma de los arrays contiguos.
La representación de listas multidimensionales es aceptada por cualquier tipo de array.
Se admiten comparaciones multidimensionales para cualquier tipo de array.
Los objetos de vista de memoria unidimensionales de tipo hash con formatos B, b, o c ahora son hashables (Contribución por Antoine Pitrou en el issue 13411.)
Arbitrary slicing of any 1-D arrays type is supported. For example, it is now possible to reverse a memoryview in O(1) by using a negative step.
Cambios en la API¶
Oficialmente, se limita el número máximo de dimensiones a 64.
Las formas vacías, pasos, y subíndices ahora son representados por una tupla vacía, en vez de
None
.El acceso al elemento de una vista de memoria con formato “B” (bytes sin signo) ahora retorna un entero (de acuerdo con la sintaxis del módulo de estructura). Para retornar un objeto bytes, primero la vista debe ser convertida a «C».
las comparaciones de la vista de memoria ahora utilizan la estructura lógica de los operandos y comparan todos los elementos de array por valor. Se admiten todos los formatos strings en la sintaxis del módulo de estructura. Aún se admiten las vistas con strings que tengan un formato no reconocido, pero siempre se compararan como desiguales, independientemente del contenido de la vista.
Para más cambios, consulte Compilación y cambios en la API de C y Portabilidad del código C.
(Contribución por Stefan Krah en el issue 10181 .)
Ver también
PEP 3118 - Revisando el protocolo de buffer
PEP 393: Representación flexible de cadenas de caracteres¶
El tipo de cadena Unicode es modificado para admitir múltiples representaciones internas, dependiendo del caracter con el ordinal Unicode más grande (1, 2 o 4 bytes) en la cadena representada. Esto permite una representación que ahorra espacio en casos comunes, pero da acceso a UCS-4 completo en todos los sistemas. Para compatibilidad con APIS existentes, pueden existir varias representaciones en paralelo; con el tiempo, esta compatibilidad debería eliminarse gradualmente.
Por parte de Python, no debería haber inconvenientes por éste cambio.
Por parte de la API de C, PEP 393 es totalmente compatible con versiones anteriores. La API antigua debería quedar disponible al menos por cinco años. Las aplicaciones que usan la API antigua no saldrán beneficiadas por la reducción de memoria, o -peor- podrían usar un bit más de memoria, debido a que python necesitaría mantener dos versiones de cada cadena de caracteres (en el formato antiguo y en el nuevo almacenamiento)
Funcionalidad¶
Los cambios introducidos en el PEP 393 son los siguientes:
Ahora python admite siempre el rango completo de códigos Unicode, incluyendo los que no son BMP (es decir,
U+0000
toU+10FFFF
). La distinción entre ancho y angosto ya no existe, y python se comporta ahora como una compilación amplia, incluso en sistemas windows.Con la eliminación de las construcciones estrechas, han sido solucionados también los problemas específicos referentes a este tipo de construcciones, por ejemplo:
len()
Ahora siempre retorna 1 para los caracteres que no son BMP, de modo quelen('\U0010FFFF') == 1
;los pares sustitutos no se recombinan en cadenas literales, de modo que
'\uDBFF\uDFFF' != '\U0010FFFF'
;la indexación o el corte de caracteres que no son BMP, retorna el valor esperado, de modo que
'\U0010FFFF'[0]
ahora retorna'\U0010FFFF'
y no'\uDBFF'
;todas las demás funciones en la librería estándar ahora gestionan de forma correcta los puntos de código que no son BMP.
El valor de
sys.maxunicode
ahora es siempre1114111
(0x10FFFF
en hexadecimal). La funciónPyUnicode_GetMax()
aún devuelve0xFFFF
o0x10FFFF
por compatibilidad con versiones anteriores y no debe usarse con la nueva API Unicode (consulte bpo-13054).Se ha eliminado el indicador
./configure
--with-wide-unicode
.
Rendimiento y uso de recursos¶
El almacenamiento de las cadenas Unicode ahora depende del punto de código más alto en la cadena:
las cadenas de caracteres en ASCII puro y Latin1 (
U+0000-U+00FF
) usan 1 byte por punto de código;Las cadenas de caracteres BMP (
U+0000-U+FFFF
) usan 2 bytes por punto de código;las cadenas de caracteres que no son BMP (
U+10000-U+10FFFF
) usan 4 bytes por punto de código.
El efecto neto es que para la mayoría de las aplicaciones, el uso de memoria del almacenamiento de cadenas de caracteres debería disminuir significativamente, especialmente en comparación con las construcciones unicode anchas, ya que, en muchos casos, las cadenas serán ASCII puro incluso en contextos internacionales (porque muchas cadenas almacenan datos en lenguaje no humano, tal como fragmentos XML, encabezados HTTP, datos codificados en JSON, etc.). También esperamos que, por las mismas razones, aumente la eficiencia de la caché de la CPU en aplicaciones no triviales. El uso de memoria de Python 3.3 es dos o tres veces más pequeño que Python 3.2, y un poco mejor que Python 2.7, en un punto de referencia de Django (consulte el PEP para obtener más detalles).
Ver también
- PEP 393 - Representación flexible de cadenas de caracteres
PEP escrito por Martin von Lowis; implementado por Torsten Becker y Martin von Lowis.
PEP 397: Lanzador de python para windows¶
El instalador de Python 3.3 para windows ahora incluye una aplicación lanzadora py
que puede ser utilizada para ejecutar aplicaciones python de forma independiente de la versión.
Este lanzador se invoca de forma implícita cuando haces doble click en archivos *.py
. Si el sistema tiene instalada una única versión de python, ésta versión será usada para ejecutar el archivo. Si hay múltiples versiones instaladas en el sistema, se utilizara por defecto la versión más reciente pero ésto puede ser anulado incluyendo una «línea shebang» estilo Unix en el script de Python.
El lanzador también se puede usar explícitamente desde la línea de comando como la aplicación py
. La ejecución de py
sigue las mismas reglas de selección de versión que la ejecución implícita de scripts, pero se puede seleccionar una versión más específica pasando los argumentos apropiados (como -3
para solicitar Python 3 cuando Python 2 también está instalado, o -2.6
para solicitar específicamente una versión anterior de Python cuando se instala una versión más reciente).
Además del lanzador, el instalador de Windows ahora incluye una opción para agregar el Python recién instalado al PATH del sistema. (Contribución de Brian Curtin en bpo-3561.)
Ver también
- PEP 397 - Python Launcher for Windows
PEP escrito por Mark Hammond y Martin v. Löwis; implementado por Vinay Sajip.
Documentación del lanzador: Lanzador de Python para Windows
Modificación de la ruta del instalador: Encontrar el ejecutable de Python
PEP 3151: Reelaborando de la jerarquía de excepciones de IO y OS¶
La jerarquía de excepciones generada por errores del sistema operativo ahora está simplificada y es más detallada.
No tienes que preocuparte más por cómo elegir el tipo de excepción adecuado entre OSError
, IOError
, EnvironmentError
, WindowsError
, mmap.error
, socket.error
or select.error
. Todos estos tipos de excepción son ahora una sola: OSError
. Los otros nombres se mantienen como alias por razones de compatibilidad.
Además, ahora es más fácil detectar una condición de error específica. En lugar de inspeccionar el atributo errno
(o args[0]
) para una constante particular del módulo errno
, puede seleccionar la subclase OSError
adecuada. Las subclases disponibles son las siguientes:
Y el mismo ConnectionError
tiene subclases más detalladas:
Gracias a las nuevas excepciones, los usos comunes de errno
ahora se pueden evitar. Por ejemplo, el siguiente código escrito para Python 3.2:
from errno import ENOENT, EACCES, EPERM
try:
with open("document.txt") as f:
content = f.read()
except IOError as err:
if err.errno == ENOENT:
print("document.txt file is missing")
elif err.errno in (EACCES, EPERM):
print("You are not allowed to read document.txt")
else:
raise
ahora se pueden escribir sin la importación de errno
y sin la inspección manual de atributos de excepción:
try:
with open("document.txt") as f:
content = f.read()
except FileNotFoundError:
print("document.txt file is missing")
except PermissionError:
print("You are not allowed to read document.txt")
Ver también
- PEP 3151 - Re elaboración de la jerarquía de excepciones de IO y OS
PEP escrito e implementado por Antoine Pitrou
PEP 380: Sintaxis para delegar en un subgenerador¶
PEP 380 agrega la expresión yield from
, permitiendo que un generator delegue parte de sus operaciones a otro generador. Esto permite tomar en consideración una sección de código que contenga la palabra yield
y ubicarla en otro generador. Además, el subgenerador puede regresar con un valor y el valor se pone a disposición del generador que delega.
Aunque está diseñada principalmente para su uso en la delegación a un subgenerador, la expresión yield from
en realidad permite la delegación a subiteradores arbitrarios.
Para iteradores simples, yield from iterable
es esencialmente una forma abreviada de for item in iterable: yield item
:
>>> def g(x):
... yield from range(x, 0, -1)
... yield from range(x)
...
>>> list(g(5))
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4]
Sin embargo, a diferencia de un ciclo ordinario, yield from
permite que los subgeneradores reciban valores enviados y lanzados directamente desde el ámbito de la llamada y retornen un valor final al generador externo:
>>> def accumulate():
... tally = 0
... while 1:
... next = yield
... if next is None:
... return tally
... tally += next
...
>>> def gather_tallies(tallies):
... while 1:
... tally = yield from accumulate()
... tallies.append(tally)
...
>>> tallies = []
>>> acc = gather_tallies(tallies)
>>> next(acc) # Ensure the accumulator is ready to accept values
>>> for i in range(4):
... acc.send(i)
...
>>> acc.send(None) # Finish the first tally
>>> for i in range(5):
... acc.send(i)
...
>>> acc.send(None) # Finish the second tally
>>> tallies
[6, 10]
Lo más importante de éste cambio es permitir que incluso los generadores que están diseñados para ser usados con los métodos send
y throw
sean separados en múltiples subgeneradores tan fácilmente como las funciones grandes se pueden dividir en varias subfunciones.
Ver también
- PEP 380 - Sintaxis para delegar a un subgenerador
PEP escrito por Greg Ewing; implementación por Greg Ewing, integrado en 3.3 por Renaud Blanch, Ryan Kelly y Nick Coghlan; documentación de Zbigniew Jędrzejewski-Szmek y Nick Coghlan
PEP 409: Suprimir el contexto de excepción¶
PEP 409 introduce una nueva sintaxis que permite deshabilitar la visualización del contexto de excepción encadenado. Esto permite mensajes de error más limpios en aplicaciones que convierten entre tipos de excepción:
>>> class D:
... def __init__(self, extra):
... self._extra_attributes = extra
... def __getattr__(self, attr):
... try:
... return self._extra_attributes[attr]
... except KeyError:
... raise AttributeError(attr) from None
...
>>> D({}).x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __getattr__
AttributeError: x
Sin el sufijo from None
para suprimir la causa, la excepción original se mostraría de forma predeterminada:
>>> class C:
... def __init__(self, extra):
... self._extra_attributes = extra
... def __getattr__(self, attr):
... try:
... return self._extra_attributes[attr]
... except KeyError:
... raise AttributeError(attr)
...
>>> C({}).x
Traceback (most recent call last):
File "<stdin>", line 6, in __getattr__
KeyError: 'x'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __getattr__
AttributeError: x
No se pierde ninguna capacidad de depuración, ya que el contexto de la excepción original permanece disponible en caso de ser necesario (por ejemplo, si una biblioteca suprime detalles importantes y valiosos de forma incorrecta)
>>> try:
... D({}).x
... except AttributeError as exc:
... print(repr(exc.__context__))
...
KeyError('x',)
Ver también
- PEP 409 - Supresión del contexto de excepción
PEP escrito por Ethan Furman; implementado por Ethan Furman y Nick Coghlan.
PEP 414: Literales Unicode explícitos¶
Para facilitar la transición de Python 2 para las aplicaciones de Python que reconocen Unicode y que hacen un uso intensivo de literales Unicode, Python 3.3 una vez más admite el prefijo «u
» para cadenas literales. Este prefijo no tiene importancia semántica en Python 3, se proporciona únicamente para reducir el número de cambios puramente mecánicos en la migración a Python 3, lo que facilita a los desarrolladores centrarse en los cambios semánticos más significativos (como la separación predeterminada más estricta de binary y datos de texto).
Ver también
- PEP 414 - Literales Unicode Explícitos
PEP escrito por Armin Ronacher.
PEP 3155: Nombres calificados para clases y funciones¶
Functions and class objects have a new __qualname__
attribute representing
the «path» from the module top-level to their definition. For global functions
and classes, this is the same as __name__
.
For other functions and classes,
it provides better information about where they were actually defined, and
how they might be accessible from the global scope.
Ejemplo con métodos (no vinculados):
>>> class C:
... def meth(self):
... pass
...
>>> C.meth.__name__
'meth'
>>> C.meth.__qualname__
'C.meth'
Ejemplo con clases anidadas:
>>> class C:
... class D:
... def meth(self):
... pass
...
>>> C.D.__name__
'D'
>>> C.D.__qualname__
'C.D'
>>> C.D.meth.__name__
'meth'
>>> C.D.meth.__qualname__
'C.D.meth'
Ejemplo con funciones anidadas:
>>> def outer():
... def inner():
... pass
... return inner
...
>>> outer().__name__
'inner'
>>> outer().__qualname__
'outer.<locals>.inner'
La representación en cadena de estos objetos, también se ha modificado para incluir la información nueva y más precisa:
>>> str(C.D)
"<class '__main__.C.D'>"
>>> str(C.D.meth)
'<function C.D.meth at 0x7f46b9fe31e0>'
Ver también
- PEP 3155 - Nombres calificados para clases y funciones
PEP Escrito e implementado por Antoine Pitrou.
PEP 412: Diccionario de intercambio de claves¶
Los diccionarios usados para almacenar atributos de objetos, ahora pueden compartir parte de su almacenamiento interno entre sí (a saber, la parte que almacena las claves y sus respectivos hashes). Esto reduce el consumo de memoria de programas creando varias instancias de tipos no integrados.
Ver también
- PEP 412 -Diccionario de intercambio de claves
PEP escrito e implementado por Mark Shannon.
PEP 362: Objeto de firma de función¶
Una nueva función inspect.signature()
hace que la introspección de las llamadas de Python sea fácil y directa. Se admite una amplia gama de invocables: funciones python, decoradas o no, clases y objetos functools.partial()
. Las Nuevas clases inspect.Signature
, inspect.Parameter
y inspect.BoundArguments
contienen información sobre las firmas de llamadas, tales como anotaciones, valores por defecto, tipos de parámetros, y los argumentos vinculados, lo cual simplifica considerablemente la escritura de decoradores y de cualquier código que valide o modifique las firmas de llamadas o argumentos.
Ver también
- PEP 362: - Objeto de firmas de función
PEP escrito por Brett Cannon, Yury Selivanov, Larry Hastings, Jiwon Seo; implementado por Yury Selivanov.
PEP 421: Agregar sys.implementation¶
Un nuevo atributo en el módulo sys
expone detalles específicos de la implementación del intérprete que se ésta ejecutando en el momento actual. El conjunto inicial de atributos en sys.implementation
son name
, version
, hexversion
, y cache_tag
.
La intención de sys.implementation
es consolidar dentro de un espacio de nombres, la implementación específica de datos usado por la biblioteca estándar. Esto permite que diferentes implementaciones de python puedan compartir código de la biblioteca estándar de manera más fácil. En su estado inicial, sys.implementation
contiene solo una pequeña porción de los datos específicos de la implementación. Con el tiempo esta proporción cambiará para hacer que la biblioteca estándar sea más portable..
Un ejemplo de mejor portabilidad de la biblioteca estándar es cache_tag
. A partir de Python 3.3, sys.implementation.cache_tag
es utilizado por importlib
para admitir el cumplimiento PEP 3147. Cualquier implementación de Python que utilice importlib
para su sistema de importación integrado puede usar cache_tag
para controlar el comportamiento de almacenamiento en caché de los módulos.
SimpleNamespace¶
La implementación de sys.implementation
también trae un nuevo tipo a Python: La clase types.SimpleNamespace
. En comparación con un nombre de espacio basado en mapas, como dict
, SimpleNamespace
es basado en atributos, como object
. Sin embargo a diferencia de object
, las instancias de SimpleNamespace
son editables. Esto significa que puedes agregar, eliminar, y modificar el nombre de espacio a través del acceso normal a los atributos.
Ver también
- PEP 421 - Agregar sys.implementation
PEP escrito e implementado por Mark Shannon.
Usar importlib como implementación de Import¶
bpo-2377- Replace__import__w/ importlib.__import__ bpo-13959 - Re-implementar partes de imp
en Python puro bpo-14605 - Hacer que la maquinaria de importación sea explícita bpo-14646 - Requerir que los cargadores establezcan __loader__ y __package__
La función __import__()
ahora es potenciada por la función importlib.__import__()
. Este trabajo conduce a completar la «fase 2» de PEP 302. Hay múltiples beneficios en éste cambio. En primer lugar, ha permitido que la mayoría de la maquinaria que potencia las importaciones sea expuesta, en vez de estar implícitas y ocultas en el código de C. También proporciona una única implementación para todas las máquinas virtuales de python que admitan el uso de Python 3.3 lo que ayuda a terminar con cualquier desviación específica de VM en la semántica de importación. Y finalmente facilita el mantenimiento de la importación, permitiendo que ocurra un crecimiento futuro.
Para el usuario común, no debería haber cambios visibles en la semántica. Para aquellos cuyo código realmente manipula la importación o las llamadas de importación de forma programática, los cambios de código que posiblemente sean necesarios, se tratan en la sección Porting Python code de éste documento.
Nuevas APIs¶
Uno de los grandes beneficios de éste trabajo es la exposición de lo que implica hacer que funcione la sentencia de importación. Esto significa que los varios importadores que una vez fueron implícitos, ahora son expuestos completamente como parte del paquete importlib
.
Las clases base abstractas definidas en importlib.abc
se han expandido para delimitar adecuadamente entre buscadores de rutas meta y buscadores de entrada de rutas al introducir la clase importlib.abc.MetaPathFinder
y importlib.abc.PathEntryFinder
respectivamente. El antiguo ABC de la clase importlib.abc.Finder
ahora solo se proporciona para compatibilidad con versiones anteriores y no exige ningún requisito de método.
En términos de buscadores, importlib.machinery.FileFinder
expone el mecanismo utilizado para buscar archivos fuente y de código de bytes de un módulo. Anteriormente, ésta clase era un miembro implícito de sys.path_hooks
.
Para los cargadores, la nueva clase base abstracta importlib.abc.FileLoader
ayuda a escribir un cargador que usa el sistema de archivos como mecanismo de almacenamiento para el código de un módulo. El cargador de archivos fuente (importlib.machinery.SourceFileLoader
), archivos de código byte sin fuente (importlib.machinery.SourcelessFileLoader
) y módulos de extensión (importlib.machinery.ExtensionFileLoader
) ahora están disponibles para su uso directo.
ImportError
ahora tiene los atributos name
y path
que se establecen cuando hay datos relevantes para proporcionar. También, el mensaje de importaciones fallidas ahora proporcionará el nombre completo del módulo en lugar de solo el final del nombre del mismo.
La función importlib.invalidate_caches()
ahora llamará al método con el mismo nombre en todos los buscadores almacenados en sys.path_importer_cache
para ayudar a limpiar cualquier estado almacenado según sea necesario.
Cambios visibles¶
Para conocer los posibles cambios necesarios en el código, consulte la sección Porting Python code .
Más allá de la extensión de lo que ahora expone importlib
, hay otros cambios visibles para importar. El más grande es que sys.meta_path
y sys.path_hooks
ahora almacenan todos los buscadores de rutas meta y los ganchos de entrada de rutas usados por la importación. Anteriormente, los buscadores estaban implícitos y ocultos dentro del código C de importación en lugar de estar expuestos directamente. Esto significa que ahora uno puede eliminar o cambiar fácilmente el orden de los diversos buscadores para satisfacer sus necesidades.
Otro cambio es que todos los módulos tienen un atributo __loader__
que almacena el cargador usado para crear el módulo. La PEP 302 se ha actualizado para hacer que este atributo sea obligatorio para implementar los cargadores, de manera que en el futuro, una vez que los cargadores de terceros hayan sido actualizados, las personas puedan confiar en la existencia de éste atributo. Sin embargo, hasta entonces la importación está configurando la post carga del módulo.
También se espera que ahora los cargadores establezcan el atributo __package__
de PEP 366. Una vez más, la importación por sí misma ya está configurando ésto en todos los cargadores del módulo importlib
y la importación misma está configurando la post carga del atributo.
Ahora se incluye el atributo None
dentro de sys.path_importer_cache
cuando no se encuentre ningún buscador en sys.path_hooks
. Dado que imp.NullImporter
no está directamente expuesto en sys.path_hooks
, podría no haber una certeza de que esté disponible para su uso como un valor que represente que no se ha encontrado ningún buscador.
Todos los demás cambios se relacionan con los cambios de semántica que deben tomarse en cuenta al actualizar el código a python 3.3, por lo tanto, deben leerse en la sección Portar código Python de este documento.
(Implementación por Brett Cannon)
Otros cambios de idioma¶
Algunos cambios más pequeños realizados en el lenguaje Python principal son:
Added support for Unicode name aliases and named sequences. Both
unicodedata.lookup()
and'\N{...}'
now resolve name aliases, andunicodedata.lookup()
resolves named sequences too.(Contribución de Ezio Melotti en bpo-12753.)
Base de datos Unicode actualizada a la versión 6.1.0 de UCD
Las comparaciones de igualdad en los objetos
range()
ahora retornan un resultado que refleja la igualdad de las secuencias subyacentes generadas por esos objetos de rango. (bpo-13201)Los métodos
count()
,find()
,rfind()
,index()
yrindex()
de los objetosbytes
ybytearray
ahora aceptan un entero entre 0 y 255 como su primer argumento.(Contribución por Petri Lehtinen en bpo-12170.)
Los métodos
rjust()
,ljust()
, ycenter()
debytes
ybytearray
ahora aceptan unbytearray
para el argumentofill
. (Contribución de Petri Lehtinen en bpo-12380.)Se han agregado nuevos métodos a
list
ybytearray
:copy()
yclear()
(bpo-10516). En consecuencia,MutableSequence
ahora también definen un métodoclear()
(bpo-11388).Los literales de bytes sin formato ahora se pueden escribir
rb"..."
así comobr"..."
.(Contribución de Antoine Pitrou en bpo-13748.)
El método
dict.setdefault()
ahora solo hace una sola búsqueda de la clave dada, haciéndola atómica cuando se usa con tipos incorporados.(Contribución de Filip Gruszczyński en bpo-13521.)
Los mensajes de error producidos cuando la llamada de una función no coincide con la firma han sido mejorados significativamente.
(Contribución de Benjamin Peterson.)
Un bloqueo de importación más detallado¶
Las versiones anteriores de CPython siempre se han basado en un bloqueo de importación global. Ésto conduce a problemas inesperados tales como bloqueos cuando la importación un módulo debería disparar la ejecución de código en un hilo diferente como un efecto secundario. A veces se empleaban soluciones torpes, como la función de API C PyImport_ImportModuleNoBlock()
.
En Python 3.3, la importación de un módulo toma un bloqueo por módulo. Esto serializa correctamente la importación de un módulo determinado a partir de múltiples subprocesos (impidiendo la exposición de módulos inicializados incompletamente), mientras elimina las molestias antes mencionadas.
(Contribución de Antoine Pitrou en bpo-9260.)
Funciones y tipos incorporados¶
open()
obtiene un nuevo parámetro opener: el descriptor de archivo subyacente para el objeto de archivo se obtiene llamando a opener con (file, flags). Se puede utilizar para utilizar banderas personalizadas comoos.O_CLOEXEC
, por ejemplo. Se ha añadido el modo'x'
: abierto para la creación exclusiva, fallando si el archivo ya existe.print()
: agregó el argumento de palabra clave flush. Si el argumento de palabra clave flush es verdadero, la secuencia se vacía por la fuerza.hash()
: la aleatorización de hash está habilitada de forma predeterminada, consulteobject.__hash__()
yPYTHONHASHSEED
.El tipo
str
obtiene un nuevo métodocasefold()
: retorna una copia de la cadena con mayúsculas y minúsculas, las cadenas con mayúsculas y minúsculas se pueden utilizar para la coincidencia sin mayúsculas. Por ejemplo,'ß'.casefold()
retorna'ss'
.La documentación de secuencia se ha reescrito sustancialmente para explicar mejor la distinción de secuencia binaria/texto y para proporcionar secciones de documentación específicas para los tipos de secuencia individuales integrados(bpo-4966).
Nuevos módulos¶
faulthandler¶
Este nuevo módulo de depuración faulthandler
contiene funciones para volcar los rastreos de Python explícitamente, en una falla (como una falla de segmentación), después de un tiempo de espera o en una señal de usuario. Llame a faulthandler.enable()
para instalar controladores de fallas para las señales SIGSEGV
, SIGFPE
, SIGABRT
, SIGBUS
, y SIGILL
. También puede habilitarlos al inicio configurando la variable de entorno PYTHONFAULTHANDLER
o usando la opción de línea de comandos -X
faulthandler
.
Ejemplo de una falla de segmentación en Linux:
$ python -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault
Current thread 0x00007fb899f39700:
File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
File "<stdin>", line 1 in <module>
Segmentation fault
ipaddress¶
El nuevo módulo ipaddress
proporciona herramientas para crear y manipular objetos que representen direcciones, redes e interfaces IPv4 e IPv6 (es decir, alguna dirección IP asociada con una subred IP específica)
(Contribución de Google y Peter Moody en PEP 3144 )
lzma¶
El módulo lzma
recién agregado proporciona compresión y descompresión de datos utilizando el algoritmo LZMA, incluida la compatibilidad con los formatos de archivo .xz
y .lzma
.
(Contribución de Nadeem Vawda y Per Øyvind Karlsen en bpo-6715.)
Módulos mejorados¶
abc¶
Soporte mejorado para las clases base abstractas que contienen descriptores compuestos con métodos abstractos. El enfoque recomendado para declarar descriptores abstractos ahora es proporcionar __isabstractmethod__
como una propiedad actualizada dinámicamente. Los descriptores integrados han sido actualizados en consecuencia.
La clase
abc.abstractproperty
ha quedado obsoleta, en su lugar use la claseproperty
conabc.abstractmethod()
.La clase
abc.abstractclassmethod
ha quedado obsoleta. En su lugar use el métodoclassmethod
withabc.abstractmethod()
.abc.abstractstaticmethod
ha quedado obsoleta, usestaticmethod
withabc.abstractmethod()
.
(Contribución de Darren Dale en bpo-11610. )
El método abc.ABCMeta.register()
ahora retorna las subclases registradas, lo cual significa que ahora éste puede ser usado como un decorador de clases (bpo-10868).
array¶
El módulo array
admite el tipo long long utilizando los códigos de tipo q
y Q
.
(Contribución de Oren Tirosh y Hirokazu Yamamoto en bpo-1172711.)
base64¶
Las cadenas Unicode de solo ASCII ahora son aceptadas por las funciones de decodificación de la interfaz moderna base64
. Por ejemplo, base64.b64decode ('YWJj')
retorna b'abc'
. (Contribución por Catalin Iacob en: número: 13641.)
binascii¶
Además de los objetos binarios que normalmente aceptan, las funciones a2b_
ahora también aceptan cadenas de sólo ASCII como dato de entrada. (Contribución por Antoine Petrou en bpo-13637.)
bz2¶
El módulo bz2
ha sido reescrito desde cero. Durante el proceso, han sido agregadas varias características:
Nueva función
bz2.open()
: abre un archivo comprimido por bzip2, en modo binario o en modo de texto.bz2.BZ2File
ahora puede leer y escribir en objetos de tipo archivo arbitrarios, mediante el argumento fileobj de su constructor.(Contribución de Nadeem Vawda en bpo-5863.)
La clase
bz2.BZ2File
y la funciónbz2.decompress()
ahora descomprimen entradas de flujo múltiple (como las producidas por la herramienta pbzip2). La clasebz2.BZ2File
ahora puede ser usada también para crear este tipo de archivos, usando el modo'a'
(agregar).(Contribución de Nir Aides en bpo-1625.)
La clase
bz2.BZ2File
ahora implementa toda la APIio.BufferedIOBase
, excepto los métodosdetach()
ytruncate()
.
códecs¶
El códec mbcs
ha sido reescrito para manejar correctamente los controladores de error reemplazar
e ignorar
en todas las versiones Windows. El códec mbcs
ahora admite todos los controladores de error, en lugar de solo replace
para codificar e ignore
para decodificar.
Ha sido agregado un nuevo códec únicamente para windows: cp65001
(bpo-13216). Es la página de códigos de Windows con el código 65001 (Windows UTF-8, CP_UTF8
). Por ejemplo, es usado por sys.stdout
si la página de códigos de salida de la consola se establece en cp65001 (por ejemplo, usando el comando chcp 65001
).
Los decodificadores CJK multibyte ahora se re-sincronizan más rápido. Solo ignoran el primer byte de una secuencia de bytes no válida. Por ejemplo, b'\xff\n'.decode('gb2312', 'replace')
ahora retorna un \n
después del carácter de reemplazo.
Los codificadores de códec incrementales CJK ya no se restablecen en cada llamada a sus métodos encode(). Por ejemplo:
>>> import codecs
>>> encoder = codecs.getincrementalencoder('hz')('strict')
>>> b''.join(encoder.encode(x) for x in '\u52ff\u65bd\u65bc\u4eba\u3002 Bye.')
b'~{NpJ)l6HK!#~} Bye.'
Este ejemplo resulta b'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} Bye.'
con versiones anteriores de Python.
El códec unicode_internal
ha quedado obsoleto.
colecciones¶
Adición de una nueva ChainMap
para permitir el tratamiento de un número de asignaciones como una sola unidad. (Escrito por Raymond Hettinger para bpo-11089, publicado en bpo-11297.)
Las clases base abstractas se han movido en un nuevo módulo collections.abc
, para diferenciar mejor entre las clases de colecciones abstractas y concretas. Los alias para ABC siguen presentes en el módulo collections
para preservar las importaciones existentes. (bpo-11085)
La clase Counter
ahora admite los operadores “”+”” y “”-”” unarios, así como los operadores in situ +=
, -=
, |=
, and &=
. (Contribución de Raymond Hettinger en bpo-13121.)
contextlib¶
ExitStack
ahora proporciona una base sólida para la manipulación programática de los administradores de contexto y una funcionalidad de limpieza similar. A diferencia de la API anterior contextlib.nested
(que estaba en desuso y se eliminó), la nueva API está diseñada para funcionar correctamente independientemente de si los administradores de contexto adquieren sus recursos en su método __init__
(por ejemplo, objetos de archivo) o en su método __enter__
(por ejemplo, objetos de sincronización del módulo threading
).
crypt¶
Addition of salt and modular crypt format (hashing method) and the mksalt()
function to the crypt
module.
curses¶
Si el módulo
curses
es vinculado a la nueva librería ncursesw, se usan las funciones Unicode cuando se pasen cadenas o caracteres Unicode (por ejemplo, la funciónwaddwstr()
) o en caso contrario, funciones de bytes (e.g.waddstr()
).Usa la codificación local en vez de
utf-8
para codificar cadenas Unicode.La clase
curses.window
tiene un nuevo atributocurses.window.encoding
.La clase
curses.window
tiene un nuevo métodoget_wch()
para obtener un caracter anchoEl módulo
curses
tiene una nueva funciónunget_wch()
para enviar un caracter ancho de manera que el próximoget_wch()
lo retorne
(Contribución por Iñigo Serna en bpo-6755.)
datetime¶
Las comparaciones de igualdad entre instancias conscientes e ingenuas
datetime
ahora retornanFalse
en lugar de generarTypeError
(bpo-15006).Nuevo método
datetime.datetime.timestamp()
: Retorna la marca de tiempo POSIX correspondiente a la instanciadatetime
.El método
datetime.datetime.strftime()
admite el formato de años anteriores a 1000.Ahora se puede llamar al método
datetime.datetime.astimezone()
sin argumentos para convertir la instancia datetime en la zona horaria del sistema.
decimal¶
- bpo-7652 - integrar la aritmética decimal nativa rápida.
Módulo C y libmpdec escritos por Stefan Krah.
The new C version of the decimal module integrates the high speed libmpdec library for arbitrary precision correctly rounded decimal floating-point arithmetic. libmpdec conforms to IBM’s General Decimal Arithmetic Specification.
Performance gains range from 10x for database applications to 100x for numerically intensive applications. These numbers are expected gains for standard precisions used in decimal floating-point arithmetic. Since the precision is user configurable, the exact figures may vary. For example, in integer bignum arithmetic the differences can be significantly higher.
La siguiente tabla está pensada como una ilustración. Los puntos de referencia están disponibles en https://www.bytereef.org/mpdecimal/quickstart.html.
decimal.py
_decimal
speedup
pi
42.02s
0.345s
120x
telco
172.19s
5.68s
30x
psycopg
3.57s
0.29s
12x
Características¶
La señal
FloatOperation
habilita opcionalmente las semánticas estrictas para mezclar decimales y flotantes.Si python se compila sin subprocesos, la versión C deshabilita automáticamente la costosa maquinaria de contexto local de subprocesos. En éste caso, la variable
HAVE_THREADS
se establece enFalse
.
Cambios en la API¶
El módulo C tiene los siguientes límites de contexto, dependiendo de la arquitectura de la máquina:
32-bit
64-bit
MAX_PREC
425000000
999999999999999999
MAX_EMAX
425000000
999999999999999999
MIN_EMIN
-425000000
-999999999999999999
En las plantillas de contexto (
DefaultContext
,BasicContext
andExtendedContext
) la magnitud deEmax
yEmin
se ha cambiado a999999
.El constructor
Decimal
en decimal.py no observa los límites de contexto y convierte valores con exponentes arbitrarios o precisión exacta. Dado que la versión C tiene límites internos, se usa el siguiente esquema: Si es posible, los valores son convertidos a valores exactos, de lo contrario se generaInvalidOperation
y el resultado es NaN. En éste último caso siempre es posible usarcreate_decimal()
para obtener un valor redondeado o inexacto.La función de potencia en decimal.py siempre se redondea correctamente. En la versión C, se define en términos de las funciones
exp()
yln()
correctamente redondeadas, pero el resultado final es solo «casi siempre correctamente redondeado».En la versión C, el diccionario de contexto que contiene las señales, es una
MutableMapping
. Por razones de velocidad,flags
ytraps
siempre se refiere a la mismaMutableMapping
que el contexto con el que se inicializó. Si se asigna un nuevo diccionario de señales,flags
ytraps
son actualizados con los nuevos valores, pero no hacen referencia al diccionario RHS.Decapar a
Context
produce una salida diferente para tener un formato de intercambio común para las versiones de Python y C.El orden de los argumentos en el constructor de la clase
Context
, ha sido cambiado para que coincida con el orden mostrado por la funciónrepr()
.El parámetro
watchexp
en el métodoquantize()
ha quedado obsoleto.
email¶
Marco de políticas¶
El paquete de correo electrónico ahora tiene un marco policy
. Un Policy
es un objeto con varios métodos y propiedades que controlan el comportamiento del paquete de correo electrónico. La política principal de Python 3.3 es la política Compat32
, que proporciona compatibilidad con versiones anteriores del paquete de correo electrónico en Python 3.2. Se puede especificar una policy
cuando un mensaje de correo electrónico es analizado por un parser
, o cuando se crea un objeto Message
, o cuando se serializa un correo electrónico mediante un generator
. A menos que se invalide, una política pasada a un parser
es heredada por todos los objetos Message
y los subobjetos creados por el parser
. De forma predeterminada, un generator
utilizará la política del objeto Message
que está serializando. La directiva predeterminada es compat32
.
El conjunto mínimo de controles implementado por todos los objetos policy
son:
max_line_length |
La longitud máxima, excluyendo el(los) caracter(es) linesep, que las líneas individuales pueden tener cuando un |
linesep |
El caracter usado para separar las líneas individuales cuando se serializa un |
cte_type |
|
raise_on_defect |
Hace que un “”analizador”” genere el error cuando se encuentran defectos en lugar de agregarlos a la lista “”Mensaje”” del objeto “”defectos””. |
Una nueva instancia de directiva, con nueva configuración, se crea mediante el método clone()
de objetos de política. clone
toma cualquiera de los controles anteriores como argumentos de palabra clave. Cualquier control no especificado en la llamada conserva su valor predeterminado. Por lo tanto, puede crear una directiva que utilice caracteres linesep \r\n
como este:
mypolicy = compat32.clone(linesep='\r\n')
Las directivas pueden ser usadas para facilitar la generación de mensajes en el formato requerido por la aplicación. En vez de tener que recordar especificar linesep='\r\n'
en todos los lugares en donde llamas a generator
, puedes especificarlo una sola vez cuando estableces la política usada por el analizador
o el Mensaje
, el que tu programa utilice para crear los objetos Mensaje
. Por otra parte, si necesitas generar mensajes en múltiples formas, aún puedes especificar los parámetros en la llamada al generador apropiado. O puedes tener instancias de política personalizadas para tus distintos casos, y pasarlos al crear el generator
.
Política provisional con nueva API de encabezado¶
Aunque el marco de políticas vale la pena por sí solo, la principal motivación para presentarlo es permitir la creación de nuevas políticas que implementen nuevas características para el paquete de correo electrónico, de modo que mantenga la compatibilidad con versiones anteriores para aquellos quienes no usen las nuevas directivas. Dado que las nuevas políticas introducen una nueva API, estamos lanzándolas en Python 3.3 como una provisional policy. Pueden producirse cambios incompatibles con versiones anteriores (hasta la eliminación del código) si los desarrolladores principales lo consideran necesario.
Las nuevas directivas son instancias de EmailPolicy
, y agregan los siguientes controles adicionales:
refold_source |
Controla si los encabezados analizados por un |
header_factory |
Un invocable que toma un |
El header_factory
es la clave a las nuevas características proporcionadas por las nuevas directivas. Cuando se usa una de las nuevas directivas, cualquier encabezado retornado por un objeto Message
es un objeto producido por el header_factory
, y en cualquier momento que se establece un encabezado en un Message
, éste se convierte en un objeto producido por header_factory
. Todos éstos objetos de encabezado tienen un atributo name
igual al nombre del encabezado. Los encabezados de direcciones y fechas tienen atributos adicionales que te dan acceso a los datos analizados del encabezado. Ésto significa que ahora puedes hacer cosas como ésta:
>>> m = Message(policy=SMTP)
>>> m['To'] = 'Éric <foo@example.com>'
>>> m['to']
'Éric <foo@example.com>'
>>> m['to'].addresses
(Address(display_name='Éric', username='foo', domain='example.com'),)
>>> m['to'].addresses[0].username
'foo'
>>> m['to'].addresses[0].display_name
'Éric'
>>> m['Date'] = email.utils.localtime()
>>> m['Date'].datetime
datetime.datetime(2012, 5, 25, 21, 39, 24, 465484, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000), 'EDT'))
>>> m['Date']
'Fri, 25 May 2012 21:44:27 -0400'
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400
Notarás que el nombre de visualización Unicode se codifica automáticamente como utf-8
cuando se serializa el mensaje, pero que cuando se accede al encabezado directamente, obtienes la versión unicode. Ésto elimina cualquier necesidad de lidiar con las funciones email.header
decode_header()
or make_header()
.
También puedes crear direcciones a partir de partes:
>>> m['cc'] = [Group('pals', [Address('Bob', 'bob', 'example.com'),
... Address('Sally', 'sally', 'example.com')]),
... Address('Bonzo', addr_spec='bonz@laugh.com')]
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400
cc: pals: Bob <bob@example.com>, Sally <sally@example.com>;, Bonzo <bonz@laugh.com>
La decodificación a Unicode se realiza automáticamente:
>>> m2 = message_from_string(str(m))
>>> m2['to']
'Éric <foo@example.com>'
Cuando analizas un mensaje, puedes usar los atributos addresses
y groups
de los objetos de encabezado, para acceder a los grupos y direcciones individuales:
>>> m2['cc'].addresses
(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com'), Address(display_name='Bonzo', username='bonz', domain='laugh.com'))
>>> m2['cc'].groups
(Group(display_name='pals', addresses=(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com')), Group(display_name=None, addresses=(Address(display_name='Bonzo', username='bonz', domain='laugh.com'),))
En resumen, si usas una de las nuevas directivas, la manipulación de encabezados funciona del modo que debería: Su aplicación funciona con cadenas unicode, y el paquete de correo electrónico codifica y decodifica de forma transparente el unicode desde y hacia las codificaciones de transferencia de contenido estándar RFC.
Otros cambios en la API¶
Nuevo BytesHeaderParser
, añadido al módulo parser
para complementar HeaderParser
y completar la API Bytes.
Nuevas funciones de utilidad:
format_datetime()
: dado undatetime
, produce una cadena formateada para su uso en un encabezado de correo electrónico.email.utils.parsedate_to_datetime()
: dada una cadena de fecha de un encabezado de correo electrónico, conviértela en undatetime.datetime
, o un ingenuodatetime.datetime
si el desplazamiento es-0000
.localtime()
: Sin argumento, retorna la hora local actual como un reconocimientodatetime
utilizando el localtimezone
. Teniendo en cuentadatetime
, lo convierte en undatetime
con el valor localtimezone
.
ftplib¶
ftplib.FTP
ahora acepta un argumento de palabra clavesource_address
para especificar el(host, port)
que se usará como dirección de origen en la llamada de enlace al crear el socket saliente. (Contribución de Giampaolo Rodolà en bpo-8594.)La clase
FTP_TLS
ahora proporciona una nueva funciónccc()
para revertir el canal de control a texto sin formato. Esto puede ser útil para aprovechar los firewalls que saben cómo manejar NAT con FTP no seguro sin abrir puertos fijos. (Contribución de Giampaolo Rodolà en bpo-12139.)Añadido el método
ftplib.FTP.mlsd()
que proporciona un formato de listado de directorios analizable y pone en desusoftplib.FTP.nlst()
yftplib.FTP.dir()
. (Contribución de Giampaolo Rodolà en bpo-11072.)
functools¶
El decorador functools.lru_cache()
ahora acepta un argumento de palabra clave typed
(que por defecto tiene el valor False
para asegurar que almacene en caché valores de diferentes tipos que se comparen igual en ranuras separadas de caché. (Contribución de Raymond Hettinger en bpo-13227.)
gc¶
Ahora es posible registrar devoluciones de llamadas invocadas por el recolector de basura antes y después de la recolección, utilizando la nueva lista callbacks
.
hmac¶
Se ha agregado una nueva función compare_digest()
para prevenir los ataques de canales adyacentes en resúmenes durante el análisis de tiempos. (Contribución de Nick Coghlan y Christian Heimes en bpo-15061.)
http¶
http.server.BaseHTTPRequestHandler
ahora almacena en buffer los encabezados y los escribe todos a la vez cuando se llama a end_headers()
. Se puede usar un nuevo método flush_headers()
para administrar directamente cuándo se envían los encabezados acumulados. (Contribución por Andrew Schaaf en bpo-3709.)
http.server
ahora produce una salida HTML 4.01 strict
válida. (Contribución de Ezio Melotti in bpo-13295)
La clase http.client.HTTPResponse
ahora tiene un método readinto()
, lo que significa que puede ser usado como una clase io.RawIOBase
. (Contribución de John Kuhn in bpo-13464)
html¶
html.parser.HTMLParser
ahora puede analizar el marcado no válido sin generar errores, por lo tanto, el argumento strict del constructor y la excepción HTMLParseError
ahora están en desuso. La habilidad de analizar marcado inválido es el resultado de un número de correcciones que también están disponibles en la última versión de solución de bugs de Python 2.7/3.2. (Contribución de Ezio Melotti en bpo-15114, y bpo-14538, bpo-13993, bpo-13960, bpo-13358, bpo-1745761, bpo-755670, bpo-13357, bpo-12629, bpo-1200313, bpo-670664, bpo-13273, bpo-12888, bpo-7311.)
Se ha agregado un nuevo diccionario html5
que asigna referencias de caracteres con nombre HTML5 a los caracteres Unicode equivalentes (por ejemplo, html5['gt;'] == '>'
) ha sido agregado al módulo html.entities
. El diccionario ahora también es utilizado por HTMLParser
. (Contribución por Ezio Melotti en bpo-11113 y bpo-15156.)
imaplib¶
El constructor de IMAP4_SSL
ahora acepta un parámetro SSLContext para controlar los parámetros del canal seguro.
(Contribución de Sijin Joseph en bpo-8808.)
inspect¶
Se ha añadido una nueva función getclosurevars()
. Esta función notifica el enlace actual de todos los nombres a los que se hace referencia desde el cuerpo de la función y dónde se resolvieron esos nombres, lo que facilita la comprobación del estado interno correcto al probar el código que se basa en cierres con estado.
(Contribución de Meador Inge y Nick Coghlan en bpo-13062.)
Se ha añadido una nueva función getgeneratorlocals()
. Esta función informa del enlace actual de variables locales en el marco de pila del generador, lo que facilita la comprobación del estado interno correcto al probar generadores.
(Contribución de Meador Inge en bpo-15153.)
io¶
La función open()
tiene un nuevo modo 'x'
que puede ser usado exclusivamente para crear un nuevo archivo, y lanzar un FileExistsError
si el archivo ya existe. Este está basado en el modo C11 “x” para fopen().
(Contribución de David Townsend en bpo-12760.)
El constructor de la clase TextIOWrapper
tiene un nuevo argumento opcional write_through. Si write_through es True
, se garantiza que las llamadas a write()
no se almacenarán en buffer: Cualquier dato escrito en el objeto TextIOWrapper
es llevado inmediatamente a su buffer subyacente.
itertools¶
accumulate()
ahora toma un argumento opcional func
para proporcionar una función binaria proporcionada por el usuario.
logging¶
La función basicConfig()
ahora admite un argumento opcional handlers
tomando un iterable de manejadores para agregarlo en el registrador raíz.
Un atributo de nivel de la clase append_nul
ha sido agregado a la clase SysLogHandler
para permitir el control de la adición de NUL
(\000
) byte a los registros de syslog, dado que para algunos demonios es requerido mientras que para otros se pasa al registro.
math¶
El módulo math
tiene una nueva función, log2()
, la cual retorna el logaritmo de x en base 2.
(Escrito por Mark Dickinson en bpo-11888.)
mmap¶
El método read()
ahora es más compatible con otros objetos similares a archivos: Si se omite el argumento o se especifica como None
, retorna los bytes desde la posición actual hasta el final del mapeo. (Contribución de Petri Lehtinen en bpo-12021.)
multiprocesamiento¶
La nueva función multiprocessing.connection.wait()
permite sondear varios objetos (como conexiones, sockets y tuberías) con un tiempo de espera. (Contribución de Richard Oudkerk en bpo-12328.)
Los objetos multiprocessing.Connection
ahora se pueden transferir a través de conexiones de multiprocesamiento. (Contribución de Richard Oudkerk en bpo-4892.)
multiprocessing.Process
ahora acepta un argumento de palabra clave daemon
para invalidar el comportamiento predeterminado de heredar el indicador daemon
del proceso primario (bpo-6064).
Nuevo atributo multiprocessing.Process.sentinel
permite que un programa espere múltiples objetos Process
a la vez utilizando las primitivas adecuadas del sistema operativo (por ejemplo, select
en sistemas posix).
Los nuevos métodos multiprocessing.pool.Pool.starmap()
y starmap_async()
proporcionan itertools.starmap()
equivalentes a las funciones existentes multiprocessing.pool.Pool.map()
y map_async()
. (Contribución de Hynek Schlawack en bpo-12708.)
nntplib¶
The nntplib.NNTP
class now supports the context management protocol to
unconditionally consume socket.error
exceptions and to close the NNTP
connection when done:
>>> from nntplib import NNTP
>>> with NNTP('news.gmane.org') as n:
... n.group('gmane.comp.python.committers')
...
('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
>>>
(Contribución de Giampaolo Rodolà en bpo-9795.)
os¶
El módulo
os
tiene una nueva funciónpipe2()
que hace posible crear una tubería con banderasO_CLOEXEC
oO_NONBLOCK
establecida automáticamente. Esto es especialmente útil para evitar las condiciones de carrera en programas multi-hilos.El módulo
os
tiene una nueva funciónsendfile()
que proporciona una forma eficiente de «copia cero» para copiar datos desde un descriptor de archivo (o socket) a otro. La frase «copia cero» se refiere al hecho de que la copia de los datos entre dos descriptores es realizada en su totalidad por el kernel, sin copiar los datos en los búferes del espacio de usuario. La funciónsendfile()
puede ser usada para copiar datos de forma eficiente desde un archivo en el disco a un conector de red, por ejemplo para descargar un archivo.(Revisión enviada por Ross Lagerwall y Giampaolo Rodolà en bpo-10882.)
Para evitar las condiciones de carrera, como los ataques symlink, y errores con archivos temporales y directorios, es preferible (y más rápido) manipular los descriptores de archivos en vez de los nombres de archivos. Python 3.3 mejora las funciones existentes e introduce nuevas funciones para trabajar con los descriptores de archivos (bpo-4761, bpo-10755 and bpo-14626).
El módulo
os
tiene una nueva funciónfwalk()
similar awalk()
excepto que también incluye descriptores de archivos que se refieren a los directorios visitados. Esto es especialmente útil para prevenir las carreras de enlaces simbólicos.Las siguientes funciones tienen las nuevas opciones dir_fd (rutas relativas a descriptores de archivos) y/o follow_symlinks (not following symlinks):
access()
,chflags()
,chmod()
,chown()
,link()
,lstat()
,mkdir()
,mkfifo()
,mknod()
,open()
,readlink()
,remove()
,rename()
,replace()
,rmdir()
,stat()
,symlink()
,unlink()
,utime()
. El soporte de la plataforma para usar éstos parámetros puede verificarse a través de los conjuntosos.supports_dir_fd
andos.supports_follows_symlinks
.Las siguientes funciones ahora admiten un descriptor de archivos para su argumento de ruta:
chdir()
,chmod()
,chown()
,execve()
,listdir()
,pathconf()
,exists()
,stat()
,statvfs()
,utime()
. El soporte de la plataforma para ésto puede ser verificado a través del conjuntoos.supports_fd
.
access()
acepta un argumento de palabra claveeffective_ids
acepta el uso del uid/gid efectivo en lugar del uid/gid real en la comprobación de acceso. El soporte de la plataforma para ésto, se puede comprobar a través del conjuntosupports_effective_ids
.El módulo
os
tiene dos nuevas funcionesgetpriority()
ysetpriority()
. Estas pueden ser usadas para establecer o recuperar la prioridad en una forma similar aos.nice()
pero extendidos a todos los procesos en vez de solo al proceso actual.(Revisión enviada por Giampaolo Rodolà en bpo-10784.)
La nueva función
os.replace()
permite cambiar el nombre de un archivo entre plataformas sobrescribiendo el destino. Conos.rename()
, un archivo de destino existente se sobrescribe bajo POSIX, pero lanza un error en Windows. (Contribución de Antoine Pitrou en bpo-8828.)La familia de estadísticas de funciones (
stat()
,fstat()
, ylstat()
) ahora admite la lectura de marcas de tiempo de un archivo con precisión de nanosegundos. Simétricamente,utime()
ahora puede escribir marcas de tiempo de archivos con precisión de nanosegundos. (Contribución de Larry Hastings en bpo-14127.)La nueva función
os.get_terminal_size()
consulta el tamaño del terminal adjunto al descriptor del archivo. Vea tambiénshutil.get_terminal_size()
. (Contribución de Zbigniew Jędrzejewski-Szmek en bpo-13609. )
Nuevas funciones para admitir atributos extendidos de Linux. (bpo-12720):
getxattr()
,listxattr()
,removexattr()
,setxattr()
.Nueva interfaz para el planificador. Estas funciones controlan como el sistema operativo le asigna tiempo de CPU a un proceso. Nuevas funciones:
sched_get_priority_max()
,sched_get_priority_min()
,sched_getaffinity()
,sched_getparam()
,sched_getscheduler()
,sched_rr_get_interval()
,sched_setaffinity()
,sched_setparam()
,sched_setscheduler()
,sched_yield()
,Nuevas funciones para controlar el sistema de archivos:
posix_fadvise()
: Anuncia una intención de acceder a los datos en un patrón específico, permitiendo al kernel hacer optimizaciones.posix_fallocate()
: Garantiza que se asigne el espacio suficiente a un archivo.sync()
: Fuerza la escritura de cualquier cosa en el disco.
Nuevas funciones posix adicionales:
lockf()
: Aplicar, probar o eliminar un bloqueo POSIX en un descriptor de archivo abierto.pread()
: Leer desde un descriptor de archivo en un desplazamiento, el desplazamiento del archivo permanece sin cambios.pwrite()
: Escribe en un descriptor de archivo desde un desplazamiento, dejando el desplazamiento del archivo sin cambios.readv()
: Leer desde el descriptor de un archivo en varios búferes editables.truncate()
: Truncar el archivo correspondiente a path, para que tenga como máximo length bytes de tamaño.waitid()
: Espera que se completen uno o más procesos secundarios.writev()
: Escribir los contenidos de buffers a un archivo descriptor, donde buffers es una secuencia arbitraria de buffers.getgrouplist()
(bpo-9344): Retorna una lista de ids de grupo al que pertenece el usuario especificado.
times()
anduname()
: El tipo de retorno cambió de tupla a un objeto tipo tupla con atributos con nombre.Varias plataformas admiten constantes adicionales para la función
lseek()
, tal comoos.SEEK_HOLE
yos.SEEK_DATA
.Nuevas constantes
RTLD_LAZY
,RTLD_NOW
,RTLD_GLOBAL
,RTLD_LOCAL
,RTLD_NODELETE
,RTLD_NOLOAD
, andRTLD_DEEPBIND
están disponibles en plataformas que las soporten. Éstas son para uso con la funciónsys.setdlopenflags()
, y reemplazan las constantes similares definidas enctypes
andDLFCN
. (Contribución de Victor Stinner en bpo-13226.)os.symlink()
ahora acepta (e ignora) el argumento de palabra clavetarget_is_directory
en plataformas diferentes a windows, para facilitar el soporte multiplataforma.
pdb¶
La finalización de tabulaciones ahora está disponible no solo para los nombres de los comandos, sino también para sus argumentos. Por ejemplo, para el comando break
, se completan las funciones y los nombres de archivo.
(Contribución de Georg Brandl en bpo-14210)
pickle¶
Los objetos pickle.Pickler
ahora tienen un atributo opcional dispatch_table
que permite establecer funciones de reducción por recolector.
(Contribución de Richard Oudkerk in bpo-14166.)
pydoc¶
La Tk GUI y la función serve()
han sido eliminadas del módulo pydoc
: pydoc -g
y serve()
han quedado obsoletos en Python 3.2.
re¶
Las expresiones regulares de la clase str
ahora admiten escapes de \u
and \U
.
(Contribución de Serhiy Storchaka en bpo-3665.)
sched¶
run()
ahora acepta un parámetro blocking que al configurarse en false, hace que el método ejecute los eventos planificados debido a la pronta expiración (si corresponde) y luego responde inmediatamente. Esto es útil en caso de que quieras usar lascheduler
en aplicaciones sin bloqueo. (Contribución de Giampaolo Rodolà in bpo-13449.)La clase
scheduler
ahora se puede utilizar de forma segura en entornos multiproceso. (Contribución por Josiah Carlson y Giampaolo Rodolà en bpo-8684.)Los parámetros timefunc y delayfunct del constructor de la clase
scheduler
ahora son opcionales y tienen el valor predeterminadotime.time()
ytime.sleep()
respectivamente. (Contribución de Chris Clark en bpo-13245.)El parámetro argument de
enter()
andenterabs()
ahora es opcional. (Contribución de Chris Clark en bpo-13245.)enter()
yenterabs()
ahora aceptan un parámetro kwargs. (Contribución de Chris Clark en bpo-13245.)
select¶
Solaris y plataformas derivadas tienen una nueva clase select.devpoll
para sockets asincrónicos de alto rendimiento a través de /dev/poll
. (Contribución de Jesús Cea Avión en bpo-6397.)
shlex¶
The previously undocumented helper function quote
from the
pipes
modules has been moved to the shlex
module and
documented. quote()
properly escapes all characters in a string
that might be otherwise given special meaning by the shell.
shutil¶
Nuevas funciones:
disk_usage()
: Proporciona estadísticas sobre el espacio total, usado, y libre en el disco. (Contribución de Giampaolo Rodolà in bpo-12442.)chown()
: Permite cambiar el usuario y/o grupo de las rutas dadas, además de especificar los nombres de usuario/grupo, y no solos sus id’s numèricos. (Contribución de Sandro Tosi in bpo-12191.)shutil.get_terminal_size()
: Retorna el tamaño de la ventana del terminar a la cual se adjunta el intérprete. (Contribución de Zbigniew Jędrzejewski-Szmek in bpo-13609. )
copy2()
andcopystat()
ahora conservan las marcas de tiempo de archivos con precisión de nanosegundos en plataformas que lo soporten. También conservan los «atributos extendidos» de archivo en Linux (Contribución de Larry Hastings en bpo-14127 y bpo-15238.)Algunas funciones ahora toman un argumento opcional de
symlinks
: Cuando ese parámetro es verdadero, los enlaces simbólicos no se desreferencian y la operación actúa en el enlace simbólico en sí. (o crea uno, si es relevante). (Contribución de Hynek Schlawack in bpo-12715.)Al copiar archivos a un sistema de archivos diferente,
move()
ahora gestiona los enlaces simbólicos de la forma que lo hace el comandomv
de posix, recreando el enlace simbólico en vez de copiar el contenido del archivo de destino. (Contribución de Jonathan Niehof en bpo-9993.)move()
ahora también retorna el argumentodst
como resultado.rmtree()
ahora es resistente a los ataques de enlaces simbólicos en plataformas que admiten el nuevo parámetrodir_fd
enos.open()
yos.unlink()
. (Contribución de Martin von Löwis and Hynek Schlawack in bpo-4489.)
signal¶
El módulo
signal
tiene nuevas funciones:pthread_sigmask()
: busca y/o cambia la máscara de señal del hilo de llamada (Contribución de Jean-Paul Calderone in bpo-8407);pthread_kill()
: Envía una señal a un hilo;sigpending()
: Examina funciones pendientes;sigwait()
: Espera una señal;sigwaitinfo()
: Espera una señal, retornando información detallada sobre ella;sigtimedwait()
: Es similar asigwaitinfo()
pero con un tiempo de espera.
El manejador de señales escribe el número de señal, como un único byte en vez de un byte nulo en el descriptor del archivo de activación. Por lo tanto, es posible esperar más de una señal y saber cuales señales han sido lanzadas.
signal.signal()
ysignal.siginterrupt()
lanzan un OSError, en vez de un RuntimeError: OSError no tiene atributo errno.
smtpd¶
The smtpd
module now supports RFC 5321 (extended SMTP) and RFC 1870
(size extension). Per the standard, these extensions are enabled if and only
if the client initiates the session with an EHLO
command.
Soporte inicial de ELHO
de Alberto Treviño. Ampliación de tamaño por Juhana Jauhiainen. Trabajo adicional sustancial en la revisión aportada por Michele Orrù y Dan Boswell. bpo-8739)
smtplib¶
Las clases SMTP
, SMTP_SSL
, y LMTP
ahora aceptan un argumento de palabra clave source_address
, para especificar el (host, port)
a usar como dirección de origen en la llamada de enlace al crear el socket saliente. (Contribución de Paulo Scardine en bpo-11281.)
SMTP
ahora admite el protocolo de administración de contexto, permitiendo usar a una instancia SMTP
en una declaración with
. (Contribución de Giampaolo Rodolà en bpo-11289.)
El constructor SMTP_SSL
y el método starttls()
ahora aceptan un parámetro SSLContext, para controlar los parámetros del canal seguro. (Contribución por Kasun Herath en bpo-8809.)
socket¶
La clase
socket
ahora expone métodos adicionales para procesar datos auxiliares cuando sean compatibles con la plataforma subyacente:(Contribución de David Watson en bpo-6560, basado en una revisión anterior de Heiko Wundram)
La clase
socket
ahora admite la familia del protocolo PF_CAN (https://en.wikipedia.org/wiki/Socketcan), en Linux (https://lwn.net/Articles/253425).(Contribución de Matthias Fuchs, actualizado por Tiago Gonçalves en bpo-10141.)
La clase
socket
ahora admite la familia de protocolos PF_RDS (https://en.wikipedia.org/wiki/Reliable_Datagram_Sockets y https://oss.oracle.com/projects/rds).La clase
socket
ahora admite la familia del protocoloPF_SYSTEM
en OS X. (Contribución de Michael Goderbauer en bpo-13777.)La nueva función
sethostname()
permite establecer el nombre de host en sistemas Unix si el proceso de llamada tiene suficientes privilegios. (Aportado por Ross Lagerwall en bpo-10866.)
socketserver¶
BaseServer
ahora tiene un método reemplazable service_actions()
que es llamado por el método serve_forever()
en el ciclo del servicio. ForkingMixIn
ahora usa ésto para limpiar procesos secundarios zombies. (Contribución de Justin Warkentin en bpo-11109.)
sqlite3¶
Nuevo método sqlite3.Connection
set_trace_callback()
puede ser usado para capturar un rastro de todos los comandos sql procesados por sqlite. (Contribución de Torsten Landschoff en bpo-11688.)
ssl¶
El módulo
ssl
tiene dos funciones de generación aleatoria:RAND_bytes()
: genera bytes pseudo-aleatorios criptográficamente fuertes.RAND_pseudo_bytes()
: genera bytes pseudoaleatorios.
(Contribución de Victor Stinner en bpo-12049.)
El módulo
ssl
ahora expone una jerarquía de excepciones más detallada para facilitar la inspección de varias clases de errores. (Contribución de Antoine Pitrou en bpo-11183.)load_cert_chain()
ahora acepta un argumento password que será usado si la clave privada es encriptada. (Contribución de Adam Simpkins en bpo-12803.)El intercambio de claves Diffie-Hellman, tanto regular como basado en curvas elípticas, ahora se admite a través de los métodos
load_dh_params()
yset_ecdh_curve()
. (Contribución de Antoine Pitrou en bpo-13626 y bpo-13627.)Los sockets SSL tienen un nuevo método
get_channel_binding()
que permite la implementación de ciertos mecanismos de autenticación tales como SCRAM-SHA-1-PLUS. (Contribución por Jacek Konieczny en bpo-12551.)Puedes consultar el algoritmo de compresión SSL usado por un socket SSL, gracias a su nuevo método
compression()
. El nuevo atributoOP_NO_COMPRESSION
puede ser usado para deshabilitar la compresión. (Contribución de Antoine Pitrou en bpo-13634.)Se ha agregado soporte para la extensión Next Protocol Negotiation usando el método
ssl.SSLContext.set_npn_protocols()
. (Contribución por Colin Marc en bpo-14204.)Los errores de SSL ahora pueden introspectarse más fácilmente gracias a los atributos
library
yreason
. (Contribución de Antoine Pitrou en bpo-14837.)La función
get_server_certificate()
ahora admite IPv6. (Contribución por Charles-François Natali en bpo-11811.)El nuevo atributo
OP_CIPHER_SERVER_PREFERENCE
permite configurar los sockets del servidor SSLv3 para usar la preferencia de ordenación de cifrado del servidor en lugar de la del cliente. (bpo-13635).
stat¶
La función indocumentada tarfile.filemode ha sido movida a stat.filemode()
. Este puede ser usado para convertir el modo de un archivo a una cadena de la forma “-rwxrwxrwx”.
(Contribución de Giampaolo Rodolà in bpo-14807.)
struct¶
El módulo struct
ahora admite ssize_t
y size_t
a través de los nuevos códigos n
and N
, respectivamente. (Contribución de Antoine Pitrou en bpo-3163.)
subprocess¶
Las cadenas de comandos ahora pueden ser objetos de bytes en las plataformas posix. (Contribución de Victor Stinner in bpo-8513.)
Una nueva constante DEVNULL
permite suprimir la salida de forma independiente de la plataforma. (Contribución de Ross Lagerwall en bpo-5870.)
sys¶
El módulo sys
tiene un nuevo thread_info
named tuple que almacena información sobre la implementación del hilo (bpo-11223).
tarfile¶
tarfile
ahora admite la codificación lzma
a través del módulo lzma
. (Contribución de Lars Gustäbel en bpo-5689.)
tempfile¶
El método tempfile.SpooledTemporaryFile
's truncate()
ahora acepta un parámetro size
. (Contribución de Ryan Kelly en bpo-9957.)
textwrap¶
El módulo textwrap
tiene una nueva función indent()
que facilita la adición de un prefijo común para las lineas seleccionadas en un bloque de texto (bpo-13857).
threading¶
threading.Condition
, threading.Semaphore
, threading.BoundedSemaphore
, threading.Event
, y threading.Timer
, todas las cuales son usadas para ser funciones de fábrica que retornen una instancia de clase, ahora son clases y pueden ser subclasificadas (Contribución de Éric Araujo in bpo-10968.)
El constructor de la clase threading.Thread
ahora acepta un argumento de palabra clave daemon
para anular el comportamiento predeterminado de heredar el valor del indicador daemon
desde el hilo principal (bpo-6064).
La función anteriormente privada _thread.get_ident
ahora está disponible como función pública threading.get_ident()
. Ésto elimina varios casos de acceso directo al módulo _thread
en el stdlib. El código de terceros que usaba _thread.get_ident
debería de igual forma ser cambiado para usar la nueva interfaz pública.
time¶
El PEP 418 agrega nuevas funciones al módulo time
:
get_clock_info()
: Obtiene información en un reloj.monotonic()
: Reloj monotónico (no se puede retroceder), no se ve afectado por la actualización del reloj del sistema.perf_counter()
: Contador de rendimiento con la más alta resolución disponible para medir una corta duración.process_time()
: Suma del tiempo de CPU del sistema y del usuario del proceso actual.
Otras nuevas funciones:
Las funciones
clock_getres()
,clock_gettime()
yclock_settime()
con constantesCLOCK_xxx
(Contribución de Victor Stinner in bpo-10278.)
Para mejorar la consistencia entre plataformas, la función sleep()
ahora lanza un ValueError
cuando se le pasa un valor negativo. Esto era anteriormente un error en posix, pero producía una suspensión definitiva en windows.
types¶
Adición de una nueva clase types.MappingProxyType
: Proxy de solo lectura de una asignación. (bpo-14386)
Las nuevas funciones types.new_class()
y types.prepare_class()
proporcionan soporte para la creación de tipos dinámicos compatibles. (bpo-14588)
unittest¶
Los métodos assertRaises()
, assertRaisesRegex()
, assertWarns()
, y assertWarnsRegex()
ahora aceptan un argumento de palabra clave msg cuando son usados como administradores de contexto. (Contribución por Ezio Melotti y Winston Ewert en bpo-10775.)
unittest.TestCase.run()
ahora retorna el objeto TestResult
.
urllib¶
La clase Request
ahora acepta un argumento method usado por get_method()
para determinar que método HTTP debería usarse. Por ejemplo, esto enviará una solicitud 'HEAD'
:
>>> urlopen(Request('https://www.python.org', method='HEAD'))
webbrowser¶
El módulo webbrowser
admite más «navegadores»: Google Chrome (llamado chrome, chromium, chrome-browser or chromium-browser dependiendo de la versión y del sistema operativo), y los lanzadores genéricos xdg-open, del proyecto FreeDesktop.org, y gvfs-open, el cual es el controlador URI predeterminado para GNOME3. (El primero agregado por Arnaud Calmettes en bpo-13620, el segundo por Matthias Klose en bpo-14493.)
xml.etree.ElementTree¶
El módulo xml.etree.ElementTree
ahora importa su acelerador C predeterminado, ya no es necesario importar explícitamente xml.etree.cElementTree
(Éste módulo permanece para compatibilidad con versiones anteriores, pero ya está obsoleto). Además, la familia de métodos iter
de Element
se ha optimizado (Reescrito en C). La documentación del módulo también se ha mejorado mucho, con ejemplos agregados y una referencia más detallada.
zlib¶
El nuevo atributo zlib.Decompress.eof
permite distinguir entre un flujo comprimido correctamente formado y uno incompleto o truncado. (Aportado por Nadeem Vawda en bpo-12646.)
Nuevo atributo zlib.ZLIB_RUNTIME_VERSION
informa la cadena de versión de la biblioteca zlib
subyacente que se carga en tiempo de ejecución. (Contribución de Torsten Landschoff en bpo-12306.)
Optimizaciones¶
Se han agregado importantes mejoras de rendimiento:
Gracias a PEP 393, algunas operaciones en las cadenas Unicode han sido optimizadas:
la huella de memoria se divide de 2 a 4 según el texto
codificar una cadena ASCII a UTF-8 ya no necesita codificar caracteres, la representación UTF-8 se comparte con la representación ASCII
el codificador UTF-8 ha sido optimizado
repetir una única letra ASCII y obtener una subcadena de una cadena ASCII es 4 veces más rápido
UTF-8 ahora es 2x a 4x más rápido. La codificación UTF-16 ahora es 10x más rápida.
(Contribución de Serhiy Storchaka, bpo-14624, bpo-14738 y bpo-15026.)
Construcción y cambios en la API de C¶
Los cambios en el proceso de compilación de Python y en la API de C incluyen:
Nueva función relacionada con PEP 3118:
PEP 393 Agregó nuevos tipos unicode, macros y funciones:
API de alto nivel:
API de bajo nivel:
Estructuras
PyASCIIObject
yPyCompactUnicodeObject
PyUnicode_DATA
,PyUnicode_1BYTE_DATA
,PyUnicode_2BYTE_DATA
,PyUnicode_4BYTE_DATA
PyUnicode_KIND
conPyUnicode_Kind
enum:PyUnicode_WCHAR_KIND
,PyUnicode_1BYTE_KIND
,PyUnicode_2BYTE_KIND
,PyUnicode_4BYTE_KIND
PyArg_ParseTuple
ahora acepta unbytearray
para el formatoc
(bpo-12380).
Obsoleto¶
Sistemas operativos no compatibles¶
OS/2 y VMS no son compatibles debido a la falta de un responsable de mantenimiento.
Windows 2000 y las plataformas windows que establezcan COMSPEC
a command.com
ya no son compatibles debido a la carga de mantenimiento.
La compatibilidad con OSF, que quedó obsoleta en 3.2, ha sido completamente eliminada.
Módulos , funciones y métodos obsoletos en Python¶
Pasar una cadena no vacía a
object.__format__()
está descontinuado, y producirá unTypeError
en Python 3.4 (bpo-9856).El códec
unicode_internal
quedó obsoleto a causa del PEP 393, use UTF-8, UTF-16 (utf-16-le
outf-16-be
), o UTF-32 (utf-32-le
orutf-32-be
)platform.popen()
: use el módulosubprocess
. Verifique especialmente la sección Cómo reemplazar anteriores funciones con el módulo subprocess (bpo-11377).bpo-13374: La API de bytes de Windows ha sido descontinuada en el módulo
os
. Use nombres de archivo Unicode, en vez de nombres de archivo de bytes, para no depender más de la página de códigos ANSI y admitir cualquier nombre de archivo.bpo-13988: El módulo
xml.etree.cElementTree
ha quedado obsoleto. El acelerador se utiliza automáticamente siempre que esté disponible.El comportamiento de
time.clock()
depende de la plataforma: utilice la nueva funcióntime.perf_counter()
otime.process_time()
en su lugar, dependiendo de sus requerimientos, para tener un comportamiento bien definido.La función
os.stat_float_times()
ha quedado obsoleta.abc
module:La clase
abc.abstractproperty
ha quedado obsoleta, en su lugar use la claseproperty
conabc.abstractmethod()
.La clase
abc.abstractclassmethod
ha quedado obsoleta. En su lugar use el métodoclassmethod
withabc.abstractmethod()
.abc.abstractstaticmethod
ha quedado obsoleta, usestaticmethod
withabc.abstractmethod()
.
paquete
importlib
:importlib.abc.SourceLoader.path_mtime()
ha quedado obsoleto, a favor deimportlib.abc.SourceLoader.path_stats()
ya que los archivos de código de bytes ahora almacenan tanto la hora de modificación como el tamaño del archivo fuente desde el cual se compiló el archivo de código de bytes.
Funciones y tipos obsoletos en la API de C¶
El Py_UNICODE
ha quedado obsoleto por PEP 393 y será eliminado en Python 4. Todas las funciones que utilizan éste tipo quedarán en desuso:
Funciones y métodos Unicode que utilizan los tipos Py_UNICODE
y Py_UNICODE*:
PyUnicode_FromUnicode
: usePyUnicode_FromWideChar()
oPyUnicode_FromKindAndData()
PyUnicode_AS_UNICODE
,PyUnicode_AsUnicode()
,PyUnicode_AsUnicodeAndSize()
: usePyUnicode_AsWideCharString()
PyUnicode_AS_DATA
: usePyUnicode_DATA
conPyUnicode_READ
yPyUnicode_WRITE
PyUnicode_GET_SIZE
,PyUnicode_GetSize()
: usePyUnicode_GET_LENGTH
oPyUnicode_GetLength()
PyUnicode_GET_DATA_SIZE
: usePyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str)
(sólo funciona en cadenas listas)PyUnicode_AsUnicodeCopy()
: usePyUnicode_AsUCS4Copy()
oPyUnicode_AsWideCharString()
PyUnicode_GetMax()
Funciones y macros que manipulen cadenas de caracteres Py_UNICODE*:
Py_UNICODE_strlen
: usePyUnicode_GetLength()
oPyUnicode_GET_LENGTH
Py_UNICODE_strcat
: usePyUnicode_CopyCharacters()
oPyUnicode_FromFormat()
Py_UNICODE_strcpy
,Py_UNICODE_strncpy
,Py_UNICODE_COPY
: usePyUnicode_CopyCharacters()
oPyUnicode_Substring()
Py_UNICODE_strcmp()
: usePyUnicode_Compare()
Py_UNICODE_strncmp()
: usePyUnicode_Tailmatch()
Py_UNICODE_strchr()
,Py_UNICODE_strrchr()
: usePyUnicode_FindChar()
Py_UNICODE_FILL()
: usePyUnicode_Fill()
Py_UNICODE_MATCH
Codificadores:
PyUnicode_Encode()
: usePyUnicode_AsEncodedObject()
PyUnicode_EncodeUTF7()
PyUnicode_EncodeUTF8()
: usePyUnicode_AsUTF8()
oPyUnicode_AsUTF8String()
PyUnicode_EncodeUTF32()
PyUnicode_EncodeUTF16()
PyUnicode_EncodeUnicodeEscape()
usePyUnicode_AsUnicodeEscapeString()
PyUnicode_EncodeRawUnicodeEscape()
usePyUnicode_AsRawUnicodeEscapeString()
PyUnicode_EncodeLatin1()
: usePyUnicode_AsLatin1String()
PyUnicode_EncodeASCII()
: usePyUnicode_AsASCIIString()
PyUnicode_EncodeCharmap()
PyUnicode_TranslateCharmap()
PyUnicode_EncodeMBCS()
: usePyUnicode_AsMBCSString()
oPyUnicode_EncodeCodePage()
(conCP_ACP
code_page)PyUnicode_EncodeDecimal()
,PyUnicode_TransformDecimalToASCII()
Características obsoletas¶
El código del formato 'u'
del módulo array
ha quedado obsoleto y será eliminado en Python 4, junto con el resto de la API (Py_UNICODE
).
Migración a Python 3.3¶
Esta sección enumera los cambios descritos previamente y otras correcciones que pueden requerir cambios en su código.
Portando código Python¶
La aleatoriedad de Hash ha sido habilitada de forma predeterminada. Establezca la variable de entorno
PYTHONHASHSEED
a 0, para deshabilitar la aleatoriedad de Hash. Vea también el métodoobject.__hash__()
method.bpo-12326: En Linux, sys.platform ya no contiene la versión principal. Ahora siempre es “linux”, en vez de “linux2” o “linux3” dependiendo de la versión de Linux usada para compilar Python. Reemplace sys.platform == “linux2” con sys.platform.startswith(“linux”), o directamente sys.platform == “linux” si no necesita admitir versiones anteriores de Python.
bpo-13847, bpo-14180:
time
ydatetime
:OverflowError
ahora se lanza en lugar deValueError
si una marca de tiempo está fuera de rango.OSError
ahora se genera si fallaron las funciones Cgmtime()
olocaltime()
.Los buscadores predeterminados usados para las importaciones, ahora utilizan un caché de lo que está contenido en un directorio específico. Si crea un archivo fuente de Python o archivo de código de bytes sin fuente, asegúrese de llamar a
importlib.invalidate_caches()
para limpiar la caché para que los buscadores encuentren el nuevo archivo.ImportError
ahora usa el nombre completo del módulo que se intentó importar. Las pruebas de documentos que verifican el mensaje de “ImportErrors” necesitaran ser actualizados para usar el nombre completo del módulo en vez de sólo la terminación del nombre.El argumento index para la función
__import__()
ahora tiene un valor predeterminado de 0, en vez de -1, y ya no admite valores negativos. Ha sido un descuido en la implementación de PEP 328 que el valor predeterminado permaneciera en -1. Si necesita continuar realizando una importación relativa seguida por una importación absoluta, entonces realice la importación relativa usando un índice de 1, seguida por otra importación que use un índice de 0. Sin embargo, es preferible usarimportlib.import_module()
en vez de llamar a la función__import__()
directamente.__import__()
ya no admite usar un valor de índice distinto de 0 para los módulos de alto nivel. Por ejemplo,__import__('sys', level=1)
ahora es un error.Dado que
sys.meta_path
ysys.path_hooks
ahora tienen buscadores por defecto, lo más probable es que desee usarlist.insert()
en vez delist.append()
para agregar a esas listas.Dado que
None
ahora ha sido insertado ensys.path_importer_cache
, si usted está borrando entradas en el diccionario de rutas que no tienen un buscador, usted necesitará eliminar los pares con valores deNone
yimp.NullImporter
para ser compatible con versiones anteriores. Esto conducirá a una sobrecarga adicional con las versiones más antiguas de Python que re-insertenNone
dentro desys.path_importer_cache
donde éste represente el uso de buscadores implícitos, pero semánticamente no debería cambiar nada.importlib.abc.Finder
ya no especifica un método abstractofind_module()
que debe implementarse. Si confiaba en subclases para implementar ese método, asegúrese de verificar primero la existencia del método. Sin embargo, probablemente querrá verificar primerofind_loader()
, en el caso de trabajar con path entry finders.pkgutil
ha sido convertido para usarimportlib
internamente. Esto elimina varios casos extremos donde el antiguo comportamiento de la emulación de importación PEP 302 fallaba al comparar el comportamiento del sistema real de importación. La emulación de importación en sí aún está presente, pero está en desuso. Las funcionespkgutil.iter_importers()
ypkgutil.walk_packages()
en un caso especial son los ganchos de importación estándar, por lo que aún son compatibles aunque no proporcionen el método no estándariter_modules ()
.Se ha corregido un error de larga data de cumplimiento de RFC (bpo-1079) en el análisis realizado por
email.header.decode_header()
. El código que usa el lenguaje estándar para convertir encabezados codificados en unicode (str (make_header (decode_header (h))
) no verá cambios, pero el código que mira las tuplas individuales retornadas por decode_header verá ese espacio en blanco que precede o sigue las seccionesASCII
ahora está incluido en la secciónASCII
. El código que crea encabezados usandomake_header
también debería continuar funcionando sin cambios, ya quemake_header
continúa agregando espacios en blanco entreSecciones ASCII
y noASCII
si aún no está presente en las cadenas de caracteres entrantes.email.utils.formataddr()
ahora realiza la codificación de transferencia de contenido correcta, al pasar nombres para mostrar que no son ASCII. Cualquier código que dependa del comportamiento defectuoso anterior que conservó el unicode que no esASCII
en la cadena de salida formateada deberá cambiarse (bpo-1690608).poplib.POP3.quit()
ahora puede generar errores de protocolos como todos los demás métodospoplib
. El código que asume quequit
no genera errorespoplib.error_proto
puede necesitar ser cambiado si una aplicación en particular encuentran errores enquit
(bpo-11291).El argumento
strict
para la claseemail.parser.Parser
, que quedó obsoleto desde Python 2.4, finalmente ha sido eliminado.El método
unittest.TestCase.assertSameElements
que estaba obsoleto, ha sido eliminado.La variable
time.accept2dyear
que estaba obsoleta, ha sido eliminada.El atributo
Context._clamp
que estaba obsoleto, ha sido eliminado del módulodecimal
. Este se reemplazó anteriormente por el atributo públicoclamp
. (Ver bpo-8540.)La clase interna auxiliar indocumentada
SSLFakeFile
, ha sido eliminada desmtplib
, dado que su funcionalidad ha sido proporcionada directamente porsocket.socket.makefile()
.El paso de valores negativos a la función
time.sleep()
en Windows, ahora lanza un error en vez de detenerse definitivamente. Este siempre ha lanzado un error en posix.La constante
ast.__version__
ha sido eliminada. Si usted necesita tomar decisiones afectadas por la versión AST, usesys.version_info
para tomar la decisión.El código que solía solucionar el hecho de que el módulo
threading
utilizaba funciones de fábrica mediante la subclase de las clases privadas tendrá que cambiar a la subclase de las clases ahora públicas.La indocumentada maquinaria de depuración en el módulo threading ha sido eliminada, simplificando el código. Esto no debería tener efecto en el código de producción, pero se menciona aquí en caso de que algún framework de depuración de aplicaciones interactúe con el (bpo-13550).
Portando código C¶
En el curso de los cambios en la API del búfer, se eliminó el miembro
smalltable
no documentado de la estructuraPy_buffer
y se cambió el diseño delPyMemoryViewObject
.Todas las extensiones que quedan en las partes relevantes de
memoryobject.h
oobject.h
deben ser reconstruídas.Debido a PEP 393, el tipo
Py_UNICODE
y todas las funciones que lo utilicen han quedado obsoletas (pero seguirán estando disponibles por al menos 5 años). Si usted estuvo usando APIS Unicode de bajo nivel para construir y acceder a objetos unicode, y desea beneficiarse de la reducción de huella de memoria proporcionada por PEP 393, usted debe convertir su código al nuevo Unicode API.Sin embargo, si sólo ha estado usando funciones de alto nivel como
PyUnicode_Concat()
,PyUnicode_Join()
oPyUnicode_FromFormat()
, automáticamente su código se beneficiará de las nuevas representaciones unicode.PyImport_GetMagicNumber()
ahora retorna-1
en caso de falla.Como valor negativo para el argumento level de la función
__import__()
ya no es válido, y lo mismo ahora es válido para la funciónPyImport_ImportModuleLevel()
. Esto también significa que el valor de level usado por la funciónPyImport_ImportModuleEx()
ahora es0
en vez de-1
.
Construyendo extensiones C¶
Se ha reducido el rango de nombres de archivo posibles para las extensiones C. Muy raramente se han suprimido las ortografías utilizadas: en POSIX, los archivos denominados
xxxmodule.so
,xxxmodule.abi3.so
yxxxmodule.cpython-*.so
ya no se reconocen como la implementación del móduloxxx
. Si ha estado generando estos archivos, tiene que cambiar a las otras ortografías (es decir, eliminar la cadena de caracteresmódulo
de los nombres de archivo).(implementado en bpo-14040.)
Cambios en el conmutador de línea de comandos¶
Se han quitado el indicador de línea de comandos -Q y los artefactos relacionados. La comprobación de código sys.flags.division_warning tendrá que actualizar.
(bpo-10998, contribución de Éric Araujo.)
Cuando se inicia python con
-S
,import site
ya no agregará las rutas específicas de sitio al módulo de búsqueda de rutas. En las versiones anteriores si lo hacía.(bpo-11591, contribución de Carl Meyer con ediciones de Éric Araujo.)