Convertir su código de Python 2 a Python 3

Convertir su código de Python 2 a Python 3

Python 2 llegó al final de su vida útil el 1 de enero de 2020. Python 3 ha estado disponible desde 2008, pero la conversión de 2 a 3 ha sido lenta debido a las dependencias de las bibliotecas que inicialmente no estaban disponibles en Python 3, las versiones anteriores de python 3 fueron más lento que Python 2 y también porque Python 2 funcionaba bastante bien para muchas personas. El final de la vida útil de Python 2 significa que no habrá más versiones compatibles ni correcciones de errores de Python. Algunas distribuciones de Linux, como Ubuntu y Red Hat, serán compatibles con Python 2 durante algún tiempo, pero migrar a Python 3 es una mejor solución.

¿Pensé que Python 3 era retrocompatible con Python 2?

No 100%. El cambio de Python 2 a Python 3 se tomó como una oportunidad para «arreglar» algunos problemas con Python 2. Entre ellos, promover Unicode de manera más uniforme en todo el lenguaje y aclarar algunos problemas en la sintaxis, como que la impresión sea una declaración en lugar de un función.

Algunas de las diferencias entre Python 2 y Python 3

Varias declaraciones como print, exec y otras se han cambiado a funciones integradas. Ejemplos:

print 'hello world' # valid python 2 not in python 3
print ('hello world') # valid python 3 and later versions of python 2

La división de enteros también se ha cambiado. Ejemplo:

print (5 / 2) # in python 2 result is 2 in python 3 result is 2.5

// se ha agregado a python 3 para admitir el comportamiento antiguo

Muchas funciones ahora devuelven unicode/bytes en python 3 en lugar de cadenas ascii/str en python 2. Ejemplo:

type (subprocess.checkout_output('cmd')) # returns <class 'bytes'> <class 'bytes'=""> in python 3 vs <type 'str'><type 'str'=""> in python 2

Para convertir python 3 <class ‘bytes’><class ‘bytes’=»»> en una cadena, querrá usar la opción .decode(‘ascii’).

type (subprocess.check_output('ls').decode('ascii')) # will result in a <class 'str'><class 'str'=""> in python 3

Algunas bibliotecas han sido reorganizadas.

Por ejemplo, la biblioteca python2 urllib2 se reemplazó con urllib en python 3. Urllib en Python 3 también está disponible en módulos como urllib.request y urllib.error para que pueda importarlos y obtener una funcionalidad similar a python 2.

from urllib import urlopen # python 2
from urllib.request import urlopen # python 3

Conversión de Python 2 a Python 3 principalmente automáticamente

Si bien puede realizar todos los cambios para convertir su secuencia de comandos de python de python 2 a python 3 a mano, hay una herramienta que hará gran parte del trabajo pesado por usted. 2to3 es un paquete que se puede instalar desde la biblioteca pip y también está disponible como un paquete separado en muchos repositorios de distribución. Para instalar a través de pip3

% pip3 install 2to3

Para instalar en Debian/Ubuntu

% sudo apt install 2to3

Para instalar en Fedora/CentOS

% sudo yum install 2to3

Nota: la instalación desde pip le proporcionará la última versión, mientras que las versiones de distribución pueden ser un poco más antiguas, por lo que la instalación de pip podría funcionar mejor para usted.

Corriendo 2to3

$ 2to3 --help # will provide you the help message from the system

Un par de opciones interesantes.

-l                  # will provide a list of the fixes available in 2to3.  E.g. print, exec, urllib, and others
-x                  # explicitly not run a transformation, use if one of the "fixes" doesn't work for your code base
-o                  # output dir, put transformed files into another location
--add-suffix=SUFFIX # put a suffix on converted files --add-suffix='3', will convert .py files to .py3 files
-w                  # overwrite current files with modified files

Suponiendo que tiene un directorio de código python 2 (scripts) y una carpeta de destino para el código python 3 (scripts3), puede hacer lo siguiente: El comando para realizar la conversión es el siguiente

% 2to3 scripts -n -w -o scripts3

Las opciones son las siguientes

scripts  - source dir
-n       - no backups
-w       - write-unchanged files, write file even if no changes are required by 2to3
-o       - output directory
scripts3 - output directory, where the converted scripts are written

De esta forma, el código original no se modifica y el usuario puede revisar el código convertido en la carpeta scripts3 y seguir consultando también el código original.

Modernize es un envoltorio alrededor de 2to3

Tiene un comportamiento similar a 2to3 excepto que admite el indicador –six-unicode que utilizará las seis funciones auxiliares que ayudan con la compatibilidad con Python 3.1 y Python 3.2. Probablemente usaría 2to3 a menos que se agregue una función atractiva para modernizar que lo anime a usarla. Modernize también está disponible con algunas distribuciones como Debian testing y Arch. Instalar

# pip3 install modernize

Correr

# python-modernize --help

Conejos

Hacer

Haga la conversión en pequeños trozos
Utilice herramientas como pylint para ayudarle a descubrir el código problemático, antes de convertirlo 
Compare el código antes y después de la conversión 
Utilice el depurador para validar el código crítico

No hacer

No sobrescriba su código con 2to3,recomiendo un directorio separado
No confíe en que las herramientas lo hagan todo correctamente

prueba, prueba, prueba

Independientemente de cómo convierta su código de Python 2 a Python 3, debe probarlo a fondo. Para el código Python de misión crítica, incluso sugeriría usar el depurador de Python para ejecutar el código línea por línea.

# python3 -m pdb 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *