Si usted es un desarrollador de Python, puede haber encontrado el desafío de migrar su código de Python 2 a Python 3. Python 2 ya no es compatible desde enero de 2020, y Python 3 ofrece muchas mejoras y nuevas características que lo hacen más potente, expresivo y moderno. Sin embargo, hay algunas diferencias significativas entre las dos versiones que pueden evitar que su código funcione sin problemas en ambos. Ahí es donde 2to3.py es útil.
2to3.py es un programa de Python que lee el código fuente de Python 2.x y aplica una serie de fijadores para transformarlo en código válido de Python 3.x. Es parte de la biblioteca lib2to3, que proporciona un marco genérico para las transformaciones de fuente a fuente. 2to3.py puede manejar la mayoría de la sintaxis común y los cambios semánticos entre las dos versiones, tales como sentencias de impresión, división entera, manejo de excepciones, literales Unicode y más. También puede refactor doctests, que son sesiones interactivas de Python incrustadas en docstrings o comentarios.
Necesitas 2to3.py si tienes código heredado de Python 2 que quieres migrar a Python 3, o si quieres aprender a escribir código compatible para ambas versiones. Aunque hay algunas herramientas y técnicas que pueden ayudarle a escribir código que se ejecuta en Python 2 y Python 3 (como six, future, y _future_ imports), pueden no cubrir todos los casos o pueden introducir algunos gastos generales o complejidad. Usar 2to3.py puede ayudarte a hacer una transición limpia a Python 3 y aprovechar sus nuevas características y beneficios.
También puede encontrar 2to3.py en el directorio Tools/scripts de la raíz de Python. Puede descargar la última versión de Python desde el sitio web oficial y extraer el archivo zip para acceder al script. Alternativamente, puede clonar el repositorio de Python desde GitHub y navegar a la carpeta Herramientas/scripts.
Otra opción es instalar 2to3.py con pip ejecutando `pip install 2to3`. Esto descargará e instalará el script de PyPI, el Python Package Index. A continuación, puede ejecutarlo desde cualquier directorio escribiendo `2to3` en su consola.
Para usar 2to3.py, necesitas abrir una consola (cmd si es Windows) y ejecutar el script con los argumentos apropiados . Los argumentos básicos son una lista de archivos o directorios a transformar. Por ejemplo, si tiene un archivo llamado example.py que contiene código Python 2, puede ejecutar `python 2to3.py example.py` para ver qué cambios se harían para convertirlo a Python 3. La salida será una diferencia con el archivo fuente original, mostrando las líneas que serían añadidas (+) o eliminadas (-). Por ejemplo: resultado/p>
Si desea aplicar los cambios al archivo de origen, debe usar la bandera -w, que habilita el writeback. Esto modificará el archivo original y creará una copia de seguridad con un . bak extensión (a menos que también use la bandera -n, que deshabilita la copia de seguridad). Por ejemplo:
También puede especificar un directorio en lugar de un archivo, y 2to3.py convertirá recursivamente todos los archivos . py en ese directorio. Puede usar la opción -output-dir para especificar un directorio diferente para los archivos de salida, en lugar de sobrescribir los originales. Por ejemplo: resultado/p>
2to3.py tiene muchas opciones y banderas que puedes usar para personalizar el proceso de conversión. Estas son algunas de las más útiles:
En esta sección, mostraremos algunos ejemplos de uso de 2to3.py para convertir diferentes tipos de código Python 2 a Python 3. Usaremos la siguiente tabla para resumir los archivos de entrada y salida, el comando utilizado y los principales cambios aplicados.
| Archivo de entrada |
|---|
| Archivo de salida |
|---|
| Comando |
|---|
| Principales cambios |
|---|
| example.py |
| ejemplo.py (modificado) |
| python 2to3.py -w -n example.py |
| print statements, formato de cadenas, argumentos de palabras clave |
| python2-versión/mycode (directorio) |
| python3-versión/mycode (directorio) |
| python 2to3.py -output-dir=python3-versión/mycode -W -n python2-versión/mycode |
| todos los fijadores aplicados recursivamente |
| example.py |
| (salida diff) |
| python 2to3.py -f imports -f has_key example.py |
| solo importa y tiene fijadores de claves |
# Archivo de entrada: example.py # Un ejemplo simple de Python 2 código print "Hello, world!" def greet(name): print "Hello, %s!" % name greet("Alice") greet name="Bob" # Archivo de salida: example.py # Un ejemplo simple de Python 2 code print("Hello, world!") def greet(name): print("Hello, %s!" % name) greet("Alice") greet(name="Bob") Los principales cambios que se aplicaron son:
En este ejemplo, tenemos un directorio llamado python2-version/mycode que contiene varios archivos y subdirectorios de Python 2. Queremos convertirlos a Python 3 y crear un nuevo árbol de directorios llamado python3-version/mycode. Usamos el comando `python 2to3.py --output-dir=python3-version/mycode -W -n python2-version/mycode` para hacer esto. La salida será un nuevo árbol de directorios con archivos convertidos. Aquí hay una representación simplificada de los árboles de directorios de entrada y salida:
# Árbol de directorios de entrada: python2-version/mycode mycode/ main.py utils.py tests/ test_main.py test_utils.py # Árbol de directorios de salida: python3-version/mycode mycode/ main.py utils.py tests/ test_main.py test_utils.py Los principales cambios que se aplicaron son:
En este ejemplo, tenemos un archivo llamado example.py que contiene algún código de Python 2 que usa algunos módulos y métodos obsoletos. Queremos convertir solo las importaciones y los fijadores de has_key, y ver la salida diff sin modificar el archivo original. Usamos el comando `python 2to3.py -f imports -f has_key example.py` para hacer esto. La salida será una diferencia con el archivo fuente original. Aquí está el contenido de los archivos de entrada y salida:
# Archivo de entrada: example.py # Un ejemplo simple de código Python 2 que usa módulos y métodos obsoletos para importar urllib2 import cPickle data = "name": "Alice", "age": 25 response = urllib2.urlopen("http:/exa.com", data=pickle.dumps()) content = response.read() if response.headers.has_key("Content-Type"): print "Content-Type:", response.headers["Content-Type"] # Archivo de salida: (diff) RefactoringTool: Skipping implicit fixer: buffer RefactoringTool: Skipping implicit fixer: idioms RefactoringTool: Skipping implicit fixer: set_literal RefactoringTool: Skipping implicit fixer: ws_comma -- example. (original) +++ ejemplo.py (refactored) @@ -1,7 +1,8 @@ # Un ejemplo sencillo de código Python 2 que utiliza módulos y métodos obsoletos -import urllib2 -import cPickle +import urllib.request, urllib.error, urllib.parse +import pickle data = "name": "Alice", age": 25 -response = urllib2.("http://example.com", data=pickle.dumps(data)) +response = urllib.request.urlopen("http://example.com", data=pickle.dumps(data)) content = response.read() -if response.headers.has_key("Content-Type"): +if "Content-Type" in response.header print "Content-Type:", response.headers["Content-Type"] Los principales cambios que se aplicaron son:
Aunque 2to3.py es una herramienta muy útil para convertir código de Python 2 a Python 3, no es perfecto y no puede arreglar todas las incompatibilidades entre las dos versiones. Algunos cambios pueden requerir intervención manual o pruebas, y algunos arreglos pueden introducir errores o cambiar la semántica del código. Aquí hay algunas limitaciones y advertencias de usar 2to3.py:
2to3.py es una herramienta útil para convertir código de Python 2 a Python 3. Puede manejar la mayoría de la sintaxis común y los cambios semánticos entre las dos versiones, y también puede refactor doctests. Tiene muchas opciones y banderas que le permiten personalizar el proceso de conversión, y también puede generar diferencias o volver a escribir los cambios en los archivos de origen. Sin embargo, 2to3.py no es perfecto y no puede arreglar todas las incompatibilidades entre Python 2 y Python 3. Algunos cambios pueden requerir intervención manual o pruebas, y algunos arreglos pueden introducir errores o cambiar la semántica del código. Por lo tanto, siempre debe comprobar la documentación de 2to3.py y las bibliotecas que utiliza, y probar su código a fondo antes de implementarlo.
Aquí hay algunas preguntas frecuentes sobre 2to3.py: