Notas para portar¶
Esta sección incluye notas y consejos para portar de Python 2 a Python 3, incluyendo resúmenes y referencias de los cambios en cada módulo.
Referencias¶
Las notas en esta sección se basan en los documentos Qué hay de nuevo preparados por el equipo de desarrollo de Python y el administrador de lanzamiento para cada lanzamiento.
- Qué hay de nuevo en Python 3.0
- Qué hay de nuevo en Python 3.1
- Qué hay de nuevo en Python 3.2
- Qué hay de nuevo en Python 3.3
- Qué hay de nuevo en Python 3.4
- Qué hay de nuevo en Python 3.5
Para obtener más información sobre cómo portar a Python 3, consulta
- Portando Código Python 2 a Python 3 en
docs.python.org
. - Portando a Python 3, por Lennart Regebro.
- La lista de correo python-porting.
Módulos nuevos¶
Python 3 incluye una serie de nuevos módulos, que proporcionan funciones no presentes en Python 2.
asyncio
- E/S asincrónica, bucle de eventos y otras herramientas de concurrencia
concurrent.futures
- Administrando grupos de tareas concurrentes
ensurepip
- Instalar el instalador de paquetes Python, pip
enum
- Define el tipo de enumeración
ipaddress
- Clases para trabajar con direcciones de Protocolo de Internet (IP)
pathlib
- Una interfaz orientada a objetos para trabajar con rutas de sistemas de archivos
selectors
- Abstracciones de multiplexación de E/S
statistics
- Cálculos estadísticos
venv
- Crear contextos de instalación y ejecución aislados
Módulos renombrados¶
Muchos módulos de biblioteca estándar fueron renombrados entre Python 2 y 3
como parte del PEP 3108. Todos los nombres de los nuevos módulos utilizan
consistentemente minúsculas, y algunos se han trasladado a paquetes para
organizarlos mejor los módulos relacionados. A menudo, el código que utiliza
estos módulos se puede actualizar para que trabaje con Python 3 simplemente
arreglando las instrucciones de importación. Una lista completa de los cambios
de nombre se puede encontrar en el diccionario
lib2to3.fixes.fix_imports.MAPPING
(las claves son el nombre de Python 2 y
los valores son el nombre Python 3) y en the table below.
Nombre Python 2 | Nombre Python 3 |
---|---|
__builtin__ |
builtins |
_winreg |
winreg |
BaseHTTPServer |
http.server |
CGIHTTPServer |
http.server |
commands |
subprocess |
ConfigParser |
configparser |
Cookie |
http.cookies |
cookielib |
http.cookiejar |
copy_reg |
copyreg |
cPickle |
pickle |
cStringIO |
io |
dbhash |
dbm.bsd |
dbm |
dbm.ndbm |
Dialog |
tkinter.dialog |
DocXMLRPCServer |
xmlrpc.server |
dumbdbm |
dbm.dumb |
FileDialog |
tkinter.filedialog |
gdbm |
dbm.gnu |
htmlentitydefs |
html.entities |
HTMLParser |
html.parser |
httplib |
http.client |
Queue |
queue |
repr |
reprlib |
robotparser |
urllib.robotparser |
ScrolledText |
tkinter.scrolledtext |
SimpleDialog |
tkinter.simpledialog |
SimpleHTTPServer |
http.server |
SimpleXMLRPCServer |
xmlrpc.server |
SocketServer |
socketserver |
StringIO |
io |
Tix |
tkinter.tix |
tkColorChooser |
tkinter.colorchooser |
tkCommonDialog |
tkinter.commondialog |
Tkconstants |
tkinter.constants |
Tkdnd |
tkinter.dnd |
tkFileDialog |
tkinter.filedialog |
tkFont |
tkinter.font |
Tkinter |
tkinter |
tkMessageBox |
tkinter.messagebox |
tkSimpleDialog |
tkinter.simpledialog |
ttk |
tkinter.ttk |
urlparse |
urllib.parse |
UserList |
collections |
UserString |
collections |
xmlrpclib |
xmlrpc.client |
Ver también
- El paquete six es útil para escribir código que se ejecuta en ambos
Python 2 y 3. En particular, el módulo
six.moves
permite a tu código importar módulos renombrados usando una sola declaración de importación, redirigiendo automáticamente la importación a la correcta versión del nombre según la versión de Python. - PEP 3108 – Reorganización de biblioteca estándar
Módulos retirados¶
Estos módulos ya no están presentes o sus características han sido fusionadas en otros módulos existentes.
bsddb¶
Los módulos bsddb
y dbm.bsd
han sido retirados. Los enlaces para
Berkeley DB ahora se mantienen fuera de la biblioteca estándar como bsddb3
<https://pypi.python.org/pypi/bsddb3> __.
commands¶
El modulo commands
fue desaprobado en Python 2.6 y eliminado en Python
3.0. Ve subprocess
en su lugar.
compiler¶
El módulo compiler
ha sido eliminado. Ve ast
en su lugar.
dircache¶
El módulo dircache
ha sido eliminado, sin reemplazo.
EasyDialogs¶
El módulo EasyDialogs
ha sido eliminado. Ve tkinter
en su lugar.
exceptions¶
El módulo exceptions
ha sido eliminado porque todas las excepciones
definidas allí están disponibles como clases incorporadas.
htmllib¶
El módulo htmllib
ha sido eliminado. Ve html.parser
en su lugar.
mimetools, MimeWriter, mimify, multifile, y rfc822¶
Los módulos mimetools
, MimeWriter
, mimify
,
multifile
, y rfc822
han sido eliminados. Ve email
en su
lugar.
popen2¶
El módulos popen2
ha sido eliminado. Ve subprocess
en su lugar.
sets¶
El módulo sets
quedó obsoleto en Python 2.6 y fue eliminado en Python
3.0. Usa los tipos incorporados set
y orderedset
en su lugar.
sre¶
El módulo sre
se desaprobó en Python 2.5 y se eliminó en Python 3.0. Usa
:mod: re en su lugar.
statvfs¶
El módulo statvfs
se desaprobó en Python 2.6 y se eliminó en in Python
3.0. Ve os.statvfs()
en el módulo os
en su lugar.
Módulos desaprobados¶
Estos módulos siguen presentes en la biblioteca estándar, pero están desaprobados y no deberían usarse en programas en Python 3 nuevos.
formatter¶
Formateador de salida genérico e interfaz del dispositivo. Ve Python issue 18716 para detalles.
Resumen de cambios a los módulos¶
abc¶
Los decoradores abstractproperty()
, abstractclassmethod()
, y
abstractstaticmethod()
están en desuso. Combinar abstractmethod()
con
los decoradores property()
, classmethod()
, y staticmethod()
funciona como se espera (Python issue 11610).
argparse¶
El argumento version
de ArgumentParser
ha sido eliminado
en favor de un tipo especial action
(Python issue 13248).
La forma anterior pasaba version
como argumento.
parser = argparse.ArgumentParser(version='1.0')
La nueva forma requiere añadir la definición explícita de un argumento.
parser = argparse.ArgumentParser()
parser.add_argument('--version', action='version',
version='%(prog)s 1.0')
El nombre de la opción y la cadena de formato de la versión se pueden modificar para adaptarse a las necesidades de la aplicación.
En Python 3.4, la acción de la versión se cambió para imprimir la cadena de versión a stdout en lugar de stderr (Python issue 18920).
array¶
El tipo 'c'
usado para los bytes de caracteres en la versión anterior de
Python 2 ha sido eliminado. Utiliza 'b'
o 'B'
para bytes en su lugar.
El tipo `` “u”`` para caracteres de cadenas Unicode es obsoleto y será eliminado en Python 4.0.
Los métodos tostring()
y fromstring()
han sido renombrados
tobytes()
y frombytes()
para eliminar la ambigüedad (Python issue 8990).
atexit¶
Cuando atexit
se actualizó para incluir una implementación C
(Python issue 1680961), se introdujo una regresión en la lógica de manejo de
error que causó que solo se muestre el resumen de la excepción, sin el rastreo.
Esta regresión se corrigió en Python 3.3 (Python issue 18776).
base64¶
Los métodos encodestring()
y decodestring()
han sido renombrados en
encodebytes()
y decodebytes()
respectivamente. Los nombre antiguos
siguen funcionando como aliases, pero están en desuso aliases
(Python issue 3613).
bz2¶
Instancias de BZ2File
ahora implementan el protocolo de gestor de contexto
y no necesitan ser envueltas con contextlib.closing()
.
collections¶
Las clases base abstractas definidas anteriormente en collections
se
movieron a collections.abc
, con importaciones de compatibilidad hacia
atrás en collections
, por ahora (Python issue 11085).
comands¶
Las funciones getoutput()
y getstatusoutput()
se movieron a
subprocess
y commands
ha sido borrado.
configparser¶
El antiguo módulo ConfigParser
ha sido renombrado en :mod: configparser.
La antigua clase ConfigParser
se eliminó en favor de SafeConfigParser
que a su vez ha sido renombrado en ConfigParser
. El comportamiento de
interpolación obsoleto está disponible a través de LegacyInterpolation
.
El método read()
ahora admite un argumento encoding
, por lo que ya no
es necesario usar codecs
para leer archivos de configuración con valores
Unicode en ellos.
No se recomienda usar el viejo RawConfigParser
. Proyectos nuevos deberían
usar ConfigParser(interpolation=None)
en su lugar para lograr el mismo
comportamiento.
contextlib¶
contextlib.nested()
ha sido eliminado. Pasa multiples gestore de contexto
a la misma declaración with
en su lugar.
csv¶
En lugar de usar el método next()
de un lector directamente, usa la función
incorporada next()
para invocar el iterador correctamente.
datetime¶
Comenzando con Python 3.3, comparaciones de igualdad entre instancias ingenuas
y consciente de la zona horaria de datetime
devuelven False
en lugar de
levantar un TypeError
(:pyissue: 15006).
Antes de Python 3.5, un objeto datetime.time
que representa la medianoche
se evaluaba como False
cuando se convertía en un binario. Este
comportamiento se ha eliminado en Python 3.5 (Python issue 13936).
decimal¶
Python 3.3 incorporó una implementación en C de decimal
basada en
libmpdec
. Este cambio mejoró el rendimiento, pero también incluye algunos
cambios en la interfaz y diferencias de comportamiento a la implementación en
Python puro. Ve las notas de la versión de Python 3.3 para detalles.
fractions¶
Los métodos de clase from_float()
y from_decimal()
ya no son
necesarios. Valores de coma flotante y Decimal
se pueden pasar
directamente al constructor Fraction
.
gc¶
Los indicadores DEBUG_OBJECT
y DEBUG_INSTANCE
han sido eliminados. Ya
no se necesitan para diferenciar entre clases de nuevo y viejo estilo.
gettext¶
Todas las funciones de traducción en gettext
suponen entrada y salida
Unicode, y las variantes Unicode como ugettext()
han sido eliminadas.
glob¶
La nueva función escape()
implementa una solución alternativa para la
búsqueda de archivos con metacaracteres en el nombre (Python issue 8402).
http.cookies¶
Además de las escapar comillas, SimpleCookie también codifica comas y punto y coma en valores para reflejar mejor el comportamiento real en navegadores (Python issue 9824).
imaplib¶
Bajo Python 3, imaplib
devuelve cadenas de bytes codificadas como UTF-8.
Hay soporte para aceptar cadenas Unicode y codificarlas automáticamente cuando
se envían como comandos salientes o como el nombre de usuario y la contraseña
para iniciar sesión en el servidor.
inspect¶
Las funciones getargspec()
, getfullargspec()
, getargvalues()
,
getcallargs()
, getargvalues()
, formatargspec()
, y
formatargvalues()
están obsoletas en favor de signature()
(Python issue 20438).
itertools¶
Las funciones imap()
, izip()
y ifilter()
han sido reemplazadas con
versiones de las funciones incorporadas que devuelven iterables en lugar de
objetos list
(map()
, zip()
, y filter()
respectivamente).
La función ifilterfalse()
ha sido renombrada filterfalse()
.
json¶
La interfaz de mod:json se actualizó para que solo sea compatible con str
y no con bytes
porque la especificación JSON se define usando Unicode.
locale¶
La versión normalizada del nombre de la codificación UTF-8 ha cambiada de «UTF8» a «UTF-8» porque Mac OS X y OpenBSD no admiten el uso de «UTF8» (Python issue 10154 y Python issue 10090).
logging¶
El módulo logging
ahora incluye un registrador lastResort
que es
utilizado si no se realiza ninguna otra configuración de registro por una
aplicación. Esto elimina la necesidad de configurar el registro en una
aplicación únicamente para evitar que un usuario vea mensajes de error en caso
de que la biblioteca importada por una aplicación utilize el registro, pero la
aplicación misma no.
mailbox¶
mailbox lee y escribe los archivos del buzón en modo binario, confiando en el paquete de correo electrónico para analizar los mensajes. Entrada de archivo de texto y StringIO es obsoleta (Python issue 9124).
mmap¶
Los valores devueltos por las interfaces de lectura son cadenas de bytes, y deben ser decodificado antes de ser tratados como texto.
operator¶
La función div()
ha sivo eliminada. Usa floordiv()
o truediv()
,
dependiendo de la semántica deseada.
La función repeat()
ha sido eliminada. Usa mul()
en su lugar.
Las funciones getslice()
, setslice()
, y delslice()
han sido
eliminadas. Usa getitem()
, setitem()
, y delitem()
con índices en
su lugar.
isinstance(obj, collections.Callable)
Las funciones de comprobación de tipos isMappingType()
,
isSequenceType()
, y isNumberType()
han sido eliminadas. Use las clases
base abstractas relevantes de collections
o numbers
en su lugar.
isinstance(obj, collections.Mapping)
isinstance(obj, collections.Sequence)
isinstance(obj, numbers.Number)
La función sequenceIncludes()
ha sido eliminada. Usa contains()
en su
lugar.
os¶
Las funciones popen2()
, popen3()
y popen4()
han sido eliminadas.
popen()
todavía está presente pero es obsoleta y emite advertencias si se
usa. El código que usa estas funciones debe ser reescrito para usar
subprocess
en su lugar para ser más portátil.
Las funciones os.tmpnam()
, os.tempnam()
y os.tmpfile()
han sido
eliminadas. Usa el módulo tempfile
en lugar.
La función os.stat_float_times()
está en desuso (Python issue 14711).
os.unsetenv()
ya no ignora errores (Python issue 13415).
os.path¶
os.path.walk()
ha sido eliminada. Usa os.walk()
en su lugar.
pdb¶
El alias decomando print
ha sido eliminado para que no sombree la función
print()
(Python issue 18764). El atajo p
se mantiene.
pickle¶
La implementación en C del módulo Pickle de Python 2 se ha movido a un nuevo
módulo que se usa automáticamente para reemplazar la implementación en Python
cuando sea posible. El viejo idioma de buscar para la importación cPickle
antes de pickle
ya no es necesario.
try:
import cPickle as pickle
except:
import pickle
Con la importación automática de la implementación en C, solo es necesario
importar el módulo pickle
directamente.
import pickle
Interoperabilidad entre Python 2.x y 3.x se ha mejorado para datos conservados utilizando el nivel 2 o inferior de protocolo para resolver un problema introducido cuando una gran cantidad de módulos de la biblioteca estándar fueron renombrados durante la transición a Python 3. Porque los datos en conservados incluyen referencias a nombres de clases y tipos, y esos nombres han cambiado, era difícil intercambiar datos conservados entre programas en Python 2 y 3. Ahora para los datos en conservados usando el nivel de protocolo 2 o anterior, los nombres antiguos de las clases se usan automáticamente al escribir y leer de un flujo de pickle.
Este comportamiento está disponible por defecto y se puede desactivar
utilizando la opción fix_imports
. Este cambio mejora la situación, pero no
elimina las incompatibilidades por completo. En particular, es posible que los
datos conservados en Python 3.1 no puedan leerse en Python 3.0. Para
garantizar la máxima portabilidad entre las aplicaciones de Python 3, usa nivel
protocolo de 3, que no incluye esta característica de compatibilidad.
La versión de protocolo por defeco ha cambiado de 0
, la versión humanamente
legible, a 3
, el formato binario con la mejor interoperabilidad cuando se
comparte entre aplicaciones de Python 3.
Datos de cadena de bytes escritos en un pickle por una aplicación Python 2.x
son decodificados cuando se leen para crear un objeto de cadena Unicode. La
codificación para la transformación tiene como valor por defecto ASCII, y se
puede cambiar pasando valores al Unpickler
.
pipes¶
pipes.quote()
se ha movido a shlex
(Python issue 9723).
platform¶
platform.popen()
ha sido desaprobada. Usa subprocess.popen()
en su lugar (Python issue 11377).
platform.uname()
ahora devuelve un namedtuple
.
Porque las distribuciones de Linux no tienen una forma consistente de
describirse ellas mismas, las funciones para obtener las descripciones
(platform.dist()
y platform.linux_distribution()
) son obsoletas y
programadas para ser eliminadas en Python 3.7 (Python issue 1322).
random¶
La función jumpahead()
fue eliminada en Python 3.0.
re¶
El indicador UNICODE
representa el comportamiento por defecto. Para
restaurar el comportamiento específico de ASCII de Python 2, usa el indicador
ASCII
.
shelve¶
El formato de salida por defecto para shelve
puede crear un archivo con
una extensión .db` agregada al nombre dado a shelve.open()
.
signal¶
PEP 475 significa que las llamadas al sistema que son interrumpidas y que
vuelven con EINTR
se vuelven a intentar. Esto cambia el comportamiento de
los controladores de señal y otras llamadas al sistema, desde ahora después de
que el controladore de señales devuelve la llamada interrumpida se reintentará,
a menos que el controladore de señal genere una excepción. Consulta la
documentación de PEP para obtener detalles completos.
socket¶
Bajo Python 2 típicamente los objetos str
pueden ser enviardos directamente
por un socket. Porque str
reemplaza a unicode
, en Python 3 los valores
deben ser codificados antes de ser enviados. Los ejemplos en la sección
socket
utilizan cadenas de bytes, que ya están codificadas.
socketserver¶
El módulo socketserver
se llamada SocketServer
en Python 2.
string¶
Todas las funciones del módulo string
que también son métodos de objetos
str
han sido eliminadas.
Las constantes letters
, minúsculas
, y mayúsculas
han sido
eliminadas. Las nuevas constantes con nombres similares están limitadas al
conjunto de caracteres ASCII.
La función maketrans()
ha sido reemplazadas por métodos en str
,
bytes
, y bytearray
para aclarar que tipos de entrada son compatibles
con cada tabla de traducción.
struct¶
struct.pack()
ahora sólo admite cadenas de bytes cuando se usa el código de
paquete de cadena s
, y ya no codifica implícitamente una cadena objetos en
UTF-8 (Python issue 10783).
subprocess¶
El valor por defecto para el argumento close_fds
en subprocess.Popen
ha
cambiado de ser siempre False
. Este es por defecto True
en Unix. Es
True
por defecto bajo Windows si los argumentos de flujo de E/S estándar
están configurados como None
, de lo contrario, su valor predeterminado es
False
.
sys¶
La variable sys.exitfunc
ya no se verifica para una acción de limpieza a
ejecutar cuando termina un programa. Usa atexit
en su lugar.
La variable sys.subversion
ya no es definida.
Las señales sys.flags.py3k_warning
, sys.flags.division_warning
,
sys.flags.division_new
, sys.flags.tabcheck
, y sys.flags.unicode
ya
no se definen.
La variable sys.maxint
ya no es definida, usa sys.maxsize
en su lugar.
Ve PEP 237 (unificando enteros grandes y enteros).
Las variables globales de seguimiento de excepciones sys.exc_type
,
sys.exc_value
, y sys.exc_traceback
han sido eliminadas. La función
sys.exc_clear()
también se ha eliminado.
La variable sys.version_info
ahora es una instancia :py``namedtuple`` con
los atributos major
, minor
, micro
, releaselevel
, y serial
(Python issue 4285).
La función de intervalo de verificación, que controla el número de códigos de
operación que se ejecutan antes de permitir un cambio de contexto de hilo ha
sido reemplazada con un valor de tiempo absoluto en su lugar, administrado con
sys.setswitchinterval()
. Las viejas funciones para administrar el el
intervalo de verificación, sys.getcheckinterval()
y
sys.setcheckinterval()
, están en desuso.
Las variables sys.meta_path
y sys.path_hooks
ahora exponen todos los
buscadores de ruta y ganchos de entrada para importar módulos. En versiones
anteriores, solo los buscadores y ganchos que eran explícitamente añadios a la
ruta eran expuestos, y la importación de C usaba los valores en su
implementación que no podían ser modificada desde el exterior.
Para sistemas Linux, sys.platform
ya no incluye el número de versión. El
valor ahora es simplemente linux
y no linux2
o linux3
.
threading¶
El módulo thread
está en desuso en favor de la interfaz en
threading
.
Las características de depuración de threading
, incluido el argumento
«verbose» ha sido eliminada de las intterfaces (Python issue 13550).
Implementaciones anteriores de threading
utilizaban funciones de fábrica
para algunas de las clases porque se implementaron en C como tipos de extensión
y no se podías subclasificar. Esa limitación del lenguaje ha sido eliminada, y
muchas de las funciones de fábrica anteriores han sido convertidos a clases
estándar, que permiten la creación de subclases (Python issue 10968).
Los símbolos públicos que exporta threading
han sido renombrados para
ser obedientes a PEP 8. Los nombres antiguos se conservan por
compatibilidad al revés , pero se eliminarán en una versión futura.
time¶
time.asctime()
y time.ctime()
se han re implementado para que no usen
las funciones del sistema pora para permitir que se usen años más grandes.
time.ctime()
ahora admite años desde 1900 hasta maxint
, aunque para
valores superiores a 9999
la cadena de salida es más larga que los 24
caracteres estándar para permitir los dígitos adicionales al año
(Python issue 8013).
unittest¶
Los métodos de TestCase
que empiezan coh «fail» (failIf()
,
failUnless()
, etc.) han sido desaprobados. Usa la forma alternativa de los
métodos assert en su lugar.
Varios alias de método anteriores han quedado obsoletos y se han reemplazado por nombres preferidos. El uso de los nombres obsoletos produce una advertencia (Python issue 9424). Ve :tabla: Métodos de unittest.TestCase desaprobados para un mapeo entre los nombres antiguos y los nuevos.
Nombre desaprobado | Nombre preferido |
---|---|
assert_() |
assertTrue() |
assertEquals() |
assertEqual() |
assertNotEquals() |
assertNotEqual() |
assertAlmostEquals() |
assertAlmostEqual() |
assertNotAlmostEquals() |
assertNotAlmostEqual() |
UserDict, UserList, y UserString¶
Las clases UserDict, UserList y UserString han sido movidas de sus propios
módulos al módulo collections
. dict
, list
, y str
se pueden
subclasificar directamente, pero las clases en collections
pueden hacer
más simple la implementación de la subclase porque el contenido del contenedor
está disponible directamente a través de un atributo de instancia. Las clases
abstractas en collections.abc
también son útiles para crear contenedores
personalizados que siguen las interfaces de los tipos incorporados.
uuid¶
uuid.getnode()
ahora usa la variable de entorno PATH` para encontrar
programas que puedan informar la dirección MAC del host bajo Unix
(Python issue 19855). Se vuelve a mirar en /sbin
y /usr/sbin
si no se
encuentra ningún programa en la ruta de búsqueda. Este comportamiento de
búsqueda puede dar resultados diferentes que con versiones anteriores de Python
si versiones alternativas de programas como netstat
, ifconfig
, ip
,
y arp
están presentes y producen diferentes resultados.
xml.etree.ElementTree¶
XMLTreeBuilder
ha sido renombrado TreeBuilder
, y la interfaz ha sufrido
varios cambios.
ElementTree.getchildren()
ha quedado en desuso. Usa list (elem)
para
crear una lista de los hijos.
ElementTree.getiterator()
ha sido desaprobado. Usa iter()
para crear
un iterador usando el protocolo de iterador normalen su lugar.
Cuando el análisis falla, en lugar de lanzar xml.parsers.expat.ExpatError
,
XMLParser
ahora lanza xml.etree.ElementTree.ParseError
.
zipimport¶
Los datos devueltos por get_data()
son una cadena de bytes, y necesitan ser
decodificados antes de ser utilizados como una cadena Unicode.