Download 2to3.py

0 views
Skip to first unread message

Sharif Garmon

unread,
Apr 25, 2024, 1:37:09 PM4/25/24
to erplettibtio

Cómo descargar y usar 2to3.py para convertir código de Python 2 a Python 3

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.

download 2to3.py


Descarga https://t.co/ggXrZNaj75



Qué es 2to3.py y por qué lo necesitas?

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.

Cómo descargar 2to3.py

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.

Cómo usar 2to3.py

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>

$ python 2to3.py example.py RefactoringTool: Skipping implicit fixer: buffer RefactoringTool: Skipping implicit fixer: idioms RefactoringTool: Skipping implicit fixer: set_literal RefactoringTool: Skipping implicit fixer: ws_comma -- example.py (original) +++ ejemplo.py (refactored) @@ -1,7 +1,7 @@ # Un ejemplo sencillo de código Python 2 -print "Hello, world!" + print("Hello, world!") -def greet(name): - print "Hello, %s!" % nombre +def saludo(nombre):+

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>

$ python 2to3.py --output-dir=python3-version/mycode -W -n python2-version/mycode RefactoringTool: Skipping implicit fixer: buffer RefactoringTool: Skipping implicit fixer: idioms RefactoringTool: Skipping implicit fixer: set_literal RefactoringTool: Skipping implicit fixer: ws_comma RefactoringTool: Refactored python2-versión/mycode/example.py --- python2-versión/mycode/example.py (original) +++ python3-versión/mycode/example.py (refactored) @@ -1,7 +1,7 @@ # Un ejemplo sencillo de código de Python 2 -print "Hello, world!" + print("Hello, world!") -def greet(name): - print "Hello, %s!" % name +def greet(name):+ print("Hello, %s!" % name) greet("Alice") -greet name="Bob" +greet(name="Bob") RefactoringTool: Archivos modificados: RefactoringTool: python2-version/mycode/example.py

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:

    • La bandera -l enumera todos los fijadores disponibles. Los fijadores son los módulos que realizan las transformaciones reales en el código. Hay más de 40 correcciones en 2to3.py, cubriendo varios aspectos de la sintaxis y semántica de Python. Por ejemplo:
      • La bandera -f especifica un conjunto explícito de fijadores a ejecutar. Puede utilizar esta opción para limitar el alcance de la conversión o para centrarse en cuestiones específicas. Por ejemplo, si solo desea convertir las sentencias print y la división integer, puede ejecutar `python 2to3.py -f print -f division example.py`.
      • La bandera -x deshabilita explícitamente un fixer. Puede usar esta opción para excluir algunos arreglos que no desea aplicar o que pueden causar problemas. Por ejemplo, si desea mantener las clases de estilo antiguo y no usar las clases de estilo nuevo, puede ejecutar `python 2to3.py -x class example.py`.
      • La bandera -d permite la refactorización de doctests. Doctests son sesiones interactivas de Python incrustadas en docstrings o comentarios, y pueden contener código de Python 2 que necesita ser convertido también. Por defecto, 2to3.py no toca doctests, pero puede usar este indicador para incluirlos en la conversión. Por ejemplo, si tienes un archivo llamado test.py que contiene doctests, puedes ejecutar `python 2to3.py -d test.py` para ver los cambios.
      • La bandera -v permite obtener más información sobre el proceso de traducción. Puedes usar esta opción para ver más detalles sobre lo que está haciendo 2to3.py, como los nombres de los fijadores, el número de archivos y líneas procesadas y el tiempo que se tarda. Por ejemplo, si ejecuta `python 2to3.py -v example.py`, verá algo como esto:
      fixes.fix_repr Fixing: tuple parameter unpacking has been removed in 3 Applied fixer: lib2to3.fixes.fix_tuple_params Fixing: sys.maxint -> sys.maxsize Applied fixer: lib2to3.fixes.fix_sys_exc Fixing: StandardError -> Exception Applied fixer: lib2to3.fixes.fix_standarderror Fixing: raise X, Y -> raise X(Y) Fixer aplicado: lib2to3.fixes.fix_raise Fijación: func.func_* -> func. Fijador aplicado: lib2to3.fixes.fix_funcattrs Fijación: obj. _nonzero__() -> obj. __bool__() Applied fixer: lib2to3.fixes.fix_nonzero Fixing: import urllib -> from urllib.request import urlopen Applied fixer: lib2to3.fixes.fix_urllib RefactoringTool: Refactored 1 files in 0.1 seconds.

      Ejemplos de uso de 2to3.py

      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

      Ejemplo 1: Convertir un solo archivo con writeback y sin respaldo

      # 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:

        • Las sentencias print se convirtieron en funciones de impresión añadiendo paréntesis.
        • El formato de cadena se convirtió para usar el método de formato de nuevo estilo reemplazando el operador % con . format().
        • Los argumentos de palabras clave se convirtieron para usar el signo = en lugar del espacio.

        Ejemplo 2: Convertir un proyecto completo de un árbol de directorios a otro

        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:

          • Todos los fijadores se aplicaron recursivamente a todos los archivos y subdirectorios.
          • Los archivos de salida fueron escritos en un nuevo árbol de directorios, preservando la estructura original.
          • No se crearon copias de seguridad y no se mostraron advertencias.

          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:

            • El fijador has_key sustituyó el método has_key de los diccionarios por el operador in, que es más legible y eficiente.

            Limitaciones y advertencias de usar 2to3.py

            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:

              • Algunas características de Python 2 no son soportadas en Python 3, como apply, execfile, long, reload, coerce, cmp, etc. Estas características pueden causar errores de sintaxis o errores de tiempo de ejecución en Python 3, y 2to3.py no puede reemplazarlas automáticamente con código equivalente. Necesitará reescribir o eliminar estas características de su código manualmente.
              • Algunas características de Python 3 no están disponibles en Python 2, como async/await, f-strings, anotaciones de tipo, operador de morsa, etc. Estas características causarán errores de sintaxis en Python 2, y 2to3.py no puede transferirlos a Python 2. Deberá evitar el uso de estas características si desea escribir código compatible para ambas versiones.
              • Algunas bibliotecas o módulos pueden no ser compatibles con ambas versiones o pueden tener diferentes API. Por ejemplo, algunos módulos de librería estándar han sido renombrados o reorganizados en Python 3 (como urllib, configparser, tkinter), algunas librerías de terceros han eliminado el soporte para Python 2 (como Django, NumPy, pandas), y algunas bibliotecas han cambiado su comportamiento o funcionalidad (como peticiones, BeautifulSoup). Tendrá que revisar la documentación de estas bibliotecas y actualizar su código en consecuencia.

              Conclusión

              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.

              Preguntas frecuentes

              Aquí hay algunas preguntas frecuentes sobre 2to3.py:

                • Q: Cómo puedo ejecutar 2to3.py en varios archivos a la vez?
                • A: Puede usar un comodín (*) para hacer coincidir varios archivos con la misma extensión, o puede especificar un directorio para convertir recursivamente todo el . py en ese directorio. Por ejemplo, `python 2to3.py -w *.py` convertirá todos los . py en el directorio actual, y `python 2to3.py -w mycode` convertirá todos los archivos . py en el directorio mycode y sus subdirectorios.
                • Q: Cómo puedo deshacer los cambios realizados por 2to3.py?
                • A: Si usaste la bandera -w sin la bandera -n, 2to3.py creará un archivo de copia de seguridad con una extensión . bak para cada archivo modificado. Puede restaurar el archivo original cambiando el nombre o copiando el archivo de copia de seguridad. Si utilizó la opción -n o no usó la opción -w, necesitará revertir manualmente los cambios o usar un sistema de control de versiones para restaurar la versión anterior de su código.
                • Q: Cómo puedo escribir código que se ejecuta tanto en Python 2 como en Python 3?
                • Q: Cómo puedo aprender más sobre 2to3.py?
                • A: Puede leer la documentación oficial de 2to3.py aquí, que explica cómo usarlo y qué fijadores están disponibles. También puedes leer este tutorial sobre cómo usar 2to3.py con ejemplos. También puedes consultar esta entrada de blog sobre cómo migrar tu código de Python 2 a Python 3 con 2to3.py.
                • Q: Cómo puedo obtener ayuda o reportar problemas con 2to3.py?
                • A: Puedes hacer preguntas o reportar problemas con 2to3.py en Stack Overflow, usando las etiquetas python-2.x, python-3.x y 2to3. También puede reportar errores o sugerir mejoras en el rastreador de problemas de Python, usando el componente Library (Lib) y la palabra clave lib2to3.
                17b9afdd22
                Reply all
                Reply to author
                Forward
                0 new messages