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.

Para obtener más información sobre cómo portar a Python 3, consulta

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.

Módulos renombrados
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.

md5

La implementación del algoritmo de resumen de mensaje MD5 se ha movido a hashlib.

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.

posixfile

El módulo posixfile ha sido eliminado. Ve io 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.

sha

La implementación del algoritmo de resumen de mensaje SHA-1 se ha movido a hashlib.

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.

thread

El módulo thread ha sido eliminado. Usa la interfaz de alto nivel en in threading en su lugar.

user

El módulo user se desaprobó en Python 2.6 y se eliminó en Python 3.0. Ve características de personalización de usuario proporcionadas por el módulo site 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.

asyncore y asynchat

Controladores de protocolo de E/S asíncrona. Ve asyncio en su lugar.

formatter

Formateador de salida genérico e interfaz del dispositivo. Ve Python issue 18716 para detalles.

imp

Accede a la implementación de la declaración de importación. Ve importlib en su lugar.

optparse

Biblioteca de análisis de opciones de línea de comandos. La interfaz para argparse es similar a la proporcionada por optparse, y en muchos casos argparse se puede utilizar como un reemplazo directo actualizando los nombres de las clases y métodos utilizados.

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

anydbm

El módulo anydbm ha sido renombado dbm in Python 3.

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.

Métodos de unittest.TestCase desaprobados
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.

whichdb

La funcionalidad de whichdb se ha movido al módulos dbm.

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.