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 *