Este documento describe los pasos y motivos por los que NVDA se mueve de Python 2.7 a 3.x.

Importante: debido a las actividades previas a la transición que están en curso, este documento se encuentra sujeto a cambios sin previo aviso.

Introducción

Python es uno de los lenguajes de programación más populares para diversos proyectos. Es fácil de aprender, tiene muchísimos módulos en su biblioteca estándar y extensiones de terceros, así como una documentación muy completa y una sintaxis clara. Todo esto hace que sea la opción ideal a la hora de elaborar scripts.

Actualmente hay dos ramas principales en Python: 2.x, liberada a principios del año 2000, y 3.x, liberada por primera vez en 2008. A primera vista, Python 3 puede parecer similar a Python 2, pero hay numerosas diferencias profundas, incluyendo el soporte extenso de Unicode en Python 3, módulos renombrados y más.

Motivos

Cuando NVDA comenzó en 2006, usaba Python 2.4. Con el paso de los años, NVDA y sus complementos se han escrito en Python 2.7. Al moverse a Python 3, NVDA busca proporcionar mejoras en el soporte Unicode, rendimiento mejorado en diversas operaciones y otros beneficios que van más allá del lector de pantalla.

Ventajas de moverse a Python 3

  • Soporte Unicode mejorado, que se traduce en esfuerzos de internacionalización más productivos.
  • Uso de nuevas técnicas relacionadas con la lectura de pantalla.
  • Revisión importante del código base de NVDA.

Desventajas de moverse a Python 3

  • Muchos complementos sin actualizar dejarán de funcionar.
  • Módulos renombrados.
  • Tener cuidado con las diferencias internas y de sintaxis.

Para comenzar

Primero, aprende más sobre las diferencias entre Python 2 y 3 leyendo la siguiente página: https://wiki.python.org/moin/Python2orPython3.

Después, instala Python 3.7 y familiarízate con el intérprete o escribiendo scripts externos. Así sabrás qué hacer cuando empiece la transición y cómo adaptar tu código (solicitudes de cambio, complementos, etc.) a Python 3. Aunque se pueden usar las versiones de 32 y 64 bits de Python 3.7 con propósitos de prueba, la transición debe hacerse mediante Python de 32 bits.

A fecha de diciembre de 2018, la mayoría de complementos no funcionan, así que se recomienda no instalar ninguno de ellos en la copia de código fuente de NVDA a menos que quieras probar tus complementos y conozcas los riesgos que implica. Como Espeak NG ya se ha llevado a Python 3, el requisito de usar Windows 10 se relaja.

Dependencias necesarias:

La mayoría de dependencias Python se pueden instalar mediante pip mientras se ejecuta como un módulo en Python 3 de la siguiente manera:

py -3 -m pip install nombreDeDependencia

Lo anterior funcionará si Python launcher está instalado y la única versión de Python 3 disponible es la 3.7 de 32 bits.

Antes de instalar cualquier dependencia de las listadas a continuación, asegúrate de instalar Python 3.7 de 32 bits. Se deben instalar aquellas dependencias marcadas como “obligatoria”.

  • Python 3.7.x de 32 bits (obligatoria)
  • Visual Studio 2017 (Community, Professional, Enterprise) (obligatoria)
  • Windows 10 SDK (compilación 17763) (obligatoria)
  • wxPython 4.0.3 para Python 3.7 (obligatoria para la interfaz gráfica y otros subsistemas cruciales)
  • Six 1.11.0 (obligatoria)
  • SCons 3.0.1 (obligatoria)
  • comtypes 1.1.7 (obligatoria)
  • Extensiones Pywin32, compilación 223 para Python 3.7 (obligatoria)
  • pyserial para Python 3.7 (obligatoria para depurar pantallas braille)
  • Configobj 5.1.0 (obligatoria)
  • Cualquier otra dependencia anunciando soporte para Python 2.x en un paquete o con una versión distinta para Python 3.x
  • Un reemplazo para py2exe para la distribución binaria (no es obligatoria hasta que no se encuentren listas para su construcción las distribuciones binarias)
  • Un reemplazo para txt2tags para generar la documentación (no es obligatoria hasta que las distribuciones binarias no estén listas para construirse)

Ejecución de la versión de NVDA para Python 3

Una vez esté instalado Python 3.7 junto con las dependencias, asumiendo que las dlls están compiladas y la versión del código fuente de NVDA cumple con Python 3, ejecuta NVDA para Python 3 desde el símbolo del sistema o Windows PowerShell de la siguiente manera:

  1. Cambia al directorio raíz del código fuente de NVDA.
  2. Después teclea una de las siguientes órdenes:
    • Si sólo está instalado Python 3.7 de 32 bits: py -3 source/nvda.pyw
    • Si tanto Python 3.7 de 32 como de 64 bits están instalados: py -3-32 source/nvda.pyw
    • Hay una versión diferente de Python 3.x instalada: py -3.7-32 source/nvda.pyw

Depuración del trabajo de transición a Python 3

Hay dos formas de depurar el flujo de trabajo de transición a Python 3:

  1. Post-mortem (NVDA falla al iniciarse o deseas ver la información de depuración a voluntad): lee el archivo nvda.log que se encuentra en el directorio “source”.
  2. Consola (para probar una idea o descubrir cómo funcionan los módulos de Python 3): se puede usar la consola Python. Ten en cuenta que no todos los mensajes de error se imprimirán en la consola, pero se pueden encontrar en el registro.

Flujo de trabajo para la transición

La siguiente es una descripción general de la transición del lector de pantalla NVDA desde Python 2 a Python 3. Ten en cuenta que la información que hay a continuación puede cambiar sin aviso previo.

Problemas destacables y soluciones:

  • Módulos renombrados en Python 3 como _winreg -> winreg, SocketServer -> socketserver, Queue -> queue y otros.
    • Intentar usar la versión de Python 3 antes de volver a los nombres de Python 2.
    • Para ciertos módulos (especialmente aquellos escritos en C), asegurarse de que los nuevos módulos no rompen la funcionalidad.
    • En al menos un caso (sintetizador de voz Espeak NG), se importa un módulo Python pero nunca se usa.
  • Módulos reorganizados en Python 3, incluyendo urllib e io.
    • Intentar cargar atributos específicos de los módulos reorganizados.
  • Importaciones absolutas frente a relativas, especialmente cuando hay alias implicados (importaciones de la forma ‘from mod import *’, observadas mayoritariamente en módulos de aplicación).
    • Usar importaciones relativas de la forma “from .mod import attr”.
  • Reemplazados algunos atributos del módulo logging.
    • Deberían cambiarse caso por caso.
  • Incapacidad de imprimir un texto significativo de registro al archivo de registro.
    • Investigar flujo / manejador de archivos / problema de redirección.
  • Uso de “async” en Python 3, que afecta a nvwave.playWaveFile(async=True) elevando un error de sintaxis.
    • Renombrar la palabra clave a “asynchronous”.
  • Diferencias de división (operadores / y //), que afectan especialmente a nvwave.WavePlayer y a la manipulación del cursor del ratón.
    • Estandarizar la división redondeando a la baja (//) para enteros, división regular (/) para números reales.
  • Bytes contra cadenas causado por la codificación, o en algunos casos, obligatorio para las dlls que esperan caracteres ANSI.
    • Intentar unificar bajo Unicode tanto como sea posible.
    • Esto se complica al trabajar con funciones en C (la dll de Espeak, por ejemplo), donde esperan cadenas ANSI pero Python las envía como Unicode.
  • Módulos eliminados e incompatibles, incluyendo new.instancemethod.
    • Encontrar un equivalente en Python 3, o usar las características incorporadas en Python.
    • Se puede decir lo mismo de las dependencias (txt2tags, por ejemplo).
  • Proporciona un método hash para las clases que implementen el método eq (NVDAObjects.NVDAObject, por ejemplo).
    • Esto es necesario debido a la aleatorización de hashes en Python 3.3 y posterior.
    • Una de las soluciones más simples es usar el método hash de la clase padre (hash = clasePadre.hash).
  • Los métodos de objeto de la forma _get_property no funcionan, observable al intentar establecer el sintetizador inicial, la pantalla braille, el objeto con el foco y demás.
    • Causado por las diferencias de sintaxis de metaclase entre Python 2 y 3.
    • Usar el especificador de metaclase de la forma “metaclase=algunaclase”.
    • Resuelto en diciembre de 2018 (mira debajo).
  • Métodos de diccionario incompatibles.
    • dict.has_key(clave): usar “clave en dict”.
    • dict.iter*: usar atributos directamente (por ejemplo, usar “dict.items()” en vez de “dict.iteritems()”).
    • Ciertos fragmentos de código esperan una lista, por lo que se envuelve la llamada al iterador dentro de un constructor de lista.
  • Ya no existe unichr.
    • Estandarizarse alredecor de “chr”.

Antes de la transición:

Fecha de inicio: 17 de septiembre de 2018

  1. Se debe liberar una versión de NVDA que funcione con WXPython 4. Esto es obligatorio, ya que WXPython 4 soporta Python 3, lo que supone un paso en la transición.
    • Requisito satisfecho el 17 de septiembre de 2018 con la liberación de NVDA 2018.3.
  2. Las dependencias a nivel de código fuente deben satisfacerse. Esto no sólo incluye WXPython 4, sino también ConfigObj, Comtypes, Pyserial, Pywin32 y otras.
    • Es necesario editar la configuración de los submódulos Git.
  3. Se deben investigar y documentar los problemas de la transición (mira arriba para ver problemas conocidos y soluciones propuestas). Usa la etiqueta “python 3”.
    • A fecha de 18 de diciembre de 2018, se han identificado al menos 20 problemas, que llevan asociadas sus respectivas solicitudes de cambio. Algunos ya se han resuelto.
  4. Si es necesario,crear solicitudes de cambio que traten con el flujo de trabajo previo a la transición, como por ejemplo hacer que el código fuente sea compatible con Python 2 y 3 (importaciones, por ejemplo).
    • Con fecha 18 de diciembre de 2018, se han enviado e integrado al menos dos solicitudes de cambio relacionadas con la transición en la rama master.

Finalización ideal: entre las versiones 2018.4 y 2019.1 de NVDA (provisionalmente el 31 de marzo de 2019).

Transición:

Fecha de inicio: no especificada

  1. Un grupo de desarrolladores (colaboradores de código, desarrolladores de complementos, programadores Python de fuera del proyecto NVDA y otros) deberían trabajar en transformar el código fuente de NVDA a Python 3.
    • No ejecutar el script 2to3 diciéndole que reemplace archivos, ya que se deben hacer retoques adicionales.
    • Para cada transformación en la iteración, probar el código para asegurarse de que la funcionalidad es idéntica (o casi idéntica) a la de versiones de NVDA antiguas.
  2. Se deben documentar las incidencias relativas a la transición.
    • Se deben etiquetar las incidencias con la etiqueta “Python 3” en GitHub.
    • Si es necesario, se deben documentar las soluciones propuestas en el sistema de incidencias.
  3. Los desarrolladores del código fuente deben probar NVDA y los complementos para asegurarse de que no se encuentran problemas importantes mientras se trabaja en la transición a Python 3. Durante esta fase, no se liberarán versiones binarias hasta que se cumpla la siguiente condición.
    • Recopilar dependencias y asegurarse de que son compatibles con Python 3.
    • Intentar ejecutar SCons en Python 3 para asegurarse de que el código está preparado.
    • Si las características funcionan, compararlas con la última versión estable de NVDA con la esperanza de capturar regresiones.
  4. Se debe encontrar un empaquetador de distribución binaria adecuado, probarlo y documentarlo. Debe crearse una serie de compilaciones binarias para asegurarse de que la combinación de NVDA codificado en Python 3, las dependencias, los empaquetadores binarios y demás funcionan bien juntos.
    • Se ha pensado en Py2exe, pero no soporta Python 3.7.
    • cx_freeze es una alternativa prometedora.
  5. Se debería invitar a los miembros del público a que prueben una serie de compilaciones de prueba hechas para comprobar el trabajo de la transición, probar complementos, documentar, extender a la comunidad y otros.

Finalización estimada: de cuatro a seis meses después de que se completen los pasos previos a la transición.

Después de la transición:

Fecha de inicio: no especificada

  1. Se debe liberar una beta de NVDA que funcione con Python 3.
  2. Los miembros del público deberían proporcionar comentarios a nivel de beta.
  3. Se solicita a los desarrolladores de complementos que migren su código a Python 3.
  4. Se libera una versión estable de NVDA que funcione con Python 3.
  5. Debería tener lugar una evaluación tras la transición, que incluya problemas documentados durante las pruebas de campo, más extensión a la comunidad y otras actividades.
  6. Si es necesario, se deberían hacer intentos para utilizar las características nativas de Python 3 (a continuación se muestra una lista de características y su posible impacto en NVDA).

Fecha estimada de finalización: no más tarde de doce a quince meses después de que se completen las actividades previas a la transición.

Progreso de la transición

  1. Antes de la transición (en progreso):
    1. 17 de julio de 2018: se liberó una alpha de NVDA con WXPython 4.0.3 integrado.
    2. 17 de agosto de 2018: se liberó NVDA 2018.3 beta 3, la primera versión beta que funciona con WXPython 4.0.3.
    3. 21 de agosto de 2018: las versiones de desarrollo alpha incluyen importaciones editadas para Python 3. El código fuente cambia para utilizar nombres de módulos de Python 3 en la mayor parte de los casos.
    4. 17 de septiembre de 2018: se libera NVDA 2018.3 con WXPython 4.0.3, con una versión que le sigue (2018.3.1) 48 horas después. Comienza oficialmente el flujo de trabajo previo a la transición.
    5. 13 de diciembre de 2018: se mezcla en la rama master una solicitud importante de cambios que introduce clases base abstractas. Esta solicitud de cambio también resuelve el problema de sintaxis de metaclase mediante el uso del módulo six.
    6. 17 de diciembre de 2018: liberada la versión estable de NVDA 2018.4.
  2. Transición: todavía no ha empezado.
  3. Después de la transición: todavía no ha empezado.
  4. Características nativas de Python 3:
    • Asyncio: no es importante en esta fase.
    • Collections.ChainMap: facilita la implementación de config.ConfigManager.
    • pyz: no tiene impacto a menos que aparezcan casos de uso.
    • Literales de cadenas formateadas (las cadenas “f”): hace más legibles los mensajes traducibles.
    • Gettext.pgettext (Python 3.8): la respuesta buscada durante tanto tiempo para los contextos de un mensaje (mira la incidencia 1524 de GitHub para más detalles).
    • Expresión de asignación (el operador := en Python 3.8): puede permitir una lectura mejorada de algunas instrucciones if y while.
    • sys.breakpointhook: ayuda al depurador de Visual Studio y compañía a depurar NVDA (si está instalado).
    • Enum: puede mejorar ciertas listas.

Notas para diversas audiencias

Para colaboradores de código:

  • Documenta problemas reales y potenciales al trabajar con Python 3, incluyendo módulos cambiados, cambios en nombres de atributos, cambios internos y demás.
  • Al importar un módulo incorporado en Python, debes usar try / except mientras se importa.
    • Intenta importar el nombre Python 2 como nombre Python 3, cambiando a la versión de Python 3 cuando el módulo de Python 2 haya sido renombrado o no se encuentre.
    • Mira el código fuente de NVDA para ver los pasos de la implementación.
    • Esto se hace para el trabajo previo a la transición. Durante la transición, se debería intentar primero la importación con Python 3.
  • Se deben etiquetar las incidencias con la etiqueta “Python 3” en GitHub.
  • Las solicitudes de cambio deberían estar basadas en la rama master a menos que los desarrolladores principales especifiquen lo contrario.
  • Intenta usar un nombre de rama de la forma “py3“, donde “” indique una característica de Python 3. Por ejemplo, py3socketserver para cambios en el módulo del servidor de sockets.
  • Si trabajas con módulos Python incorporados, asegúrate de probar tu código con los intérpretes Python 2.7 y 3.7 antes de hacer cambios al código fuente de NVDA.
    • Crea un script independiente que use funciones de Python 2 y 3.
    • Después de probar este script y si funciona en Python 3, haz cambios al código fuente de NVDA y añade comentarios relacionados con las diferencias entre Python 2 y 3.
    • El código fuente debería funcionar en Python 2 y 3 a menos que la solicitud de cambio se envíe durante el periodo de transición activo.
  • Edita esta página cada vez que se envíen cambios importantes a la rama master o se mezcle una solicitud de cambios, incluyendo cambios de importación y otros.

Para desarrolladores de complementos:

  • Intenta usar módulos Python que se sepa que son compatibles con Python 2 y 3.

Para evaluadores:

Todavía nada, la transición aún no ha comenzado.

Para traductores:

Nada todavía.

Para usuarios:

nada todavía.

Para organizaciones:

  • Permanece informado sobre el flujo de trabajo de la transición a Python 3.

Para la comunidad Python:

  • Durante el periodo previo a la transición, por favor ayudad al proyecto NVDA a detectar problemas potenciales con la transición a Python 3 para que puedan documentarse.
  • Durante la transición, por favor ayudad a escribir y probar código en Python 3 y proporcionad comentarios adicionales.
  • Durante la fase posterior a la transición, ayuda a NV Access a revisar los trabajos de transición, y sugiere funciones de Python 3 que NVDA debería adoptar,