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 compatible con versiones anteriores de 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
type (subprocess.check_output('ls').decode('ascii')) # will result in a <class 'str'><class 'str'=""> in python 3
Algunas bibliotecas han sido reorganizadas.
P.ej. 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
Convertir de Python 2 a Python 3 principalmente de forma automática
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 contenedor 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. Para instalar
# pip3 install modernize
Para correr
# python-modernize --help
Consejos
Dos
Do conversion in small chunks Do use tools like pylint to help you figure out problematic code, before you convert it Do compare the code before and after the conversion Do use the debugger to validate critical code
No hacer
Do not overwrite your code with 2to3, recommend a separate directory Do not trust in the tools to do everything correctly
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
Luego escriba n
Conclusión
Python 2 está muerto después de una vida larga y fructífera. Si todavía usa Python 2, debe convertir a Python 3. Python proporciona una herramienta en 2to3 que ayuda con la conversión de Python 2 a Python 3 y le quita mucho trabajo. 2to3 no es una herramienta perfecta, pero puede hacer mucho del trabajo por usted y reducir la complejidad de convertir de Python 2 a 3 en varios órdenes de magnitud.
Enlaces
- La página 2to3 en la biblioteca de documentación de Python https://docs.python.org/3/library/2to3.html
- La biblioteca de modernización https://pypi.org/project/modernize/
- Portación del código de Python 2 a la página de Python 3 en python.org https://docs.python.org/3/howto/pyporting.html