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

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, cambios en las importaciones, cambios en las divisiones 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. El soporte para Python 2.7 se acaba, ya no recibirá actualizaciones (rendimiento, seguridad o corrección de fallos). Por este motivo, la longevidad de NVDA depende de migrar a Python 3.

Para comenzar

Aprende más sobre las diferencias entre Python 2 y 3 con estos recursos:
– https://wiki.python.org/moin/Python2orPython3
– http://python3porting.com/
– http://python-future.org/compatible_idioms.html

Instala Python 3.7 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 (opcional)
  • 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

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:
  • Ejemplos:
    • _winreg -> winreg
    • SocketServer -> socketserver
    • Queue -> queue
  • 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:
  • Ejemplos:
    • urllib
    • 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 módulo import *’, observadas mayoritariamente en módulos de aplicación).
  • Usar importaciones relativas de la forma from .módulo import atributo
  • 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 en la división (/ frente a //):
  • Ejemplos:
    • nvwave.WavePlayer
    • Manipular el cursor del ratón.
  • Estandarizar la división redondeando a la baja (//) para enteros, división regular (/) para números reales.
  • Bytes frente a 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
  • Ejemplo:
    • 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__
  • Ejemplo:
    • NVDAObjects.NVDAObject
  • 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 que siguen el formato _get_property no funcionan
  • Por ejemplo al intentar establecer el sintetizador inicial, la pantalla braille o el objeto con el foco
  • 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 in 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 alrededor 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.
    • Requisito cumplido el 10 de junio de 2019
  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 15 de junio de 2019, se han identificado al menos 30 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 15 de junio de 2019, se han enviado e integrado al menos 15 solicitudes de cambio relacionadas con la transición en una rama transitoria.
  5. Se deben satisfacer las dependencias binarias. Estas incluyen WXPython, Py2exe y otras.
    • Requisito cumplido el 10 de junio de 2019.

Finalización ideal: entre las versiones 2019.2 y 2019.3 de NVDA (provisionalmente el 31 de julio de 2019).

Transición:

Esto se divide en dos fases:

  1. Fase 1 (cambios al código fuente): los desarrolladores de NVDA investigarán, proporcionarán correcciones y harán pruebas en incidencias relacionadas con la transición.
  2. Fase 2 (pruebas generalizadas): pruebas más allá de los desarrolladores de NVDA cuando NV Access crea que los trabajos de transición estén listos para pruebas externas.

Fase 1: cambios al código fuente

Fecha de inicio: 8 de junio de 2019

  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 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.
    • Originalmente se pensó en Py2exe, pero no soporta Python 3.7.
    • cx_freeze es una alternativa prometedora.
    • Se ha encontrado una versión de Py2exe que soporta Python 3.7.
  5. La compilación de Appveyor debe finalizar para completar.
    • A fecha del 15 de junio de 2019, tanto el código fuente como el lanzador y ciertas pruebas funcionan.

Finalización ideal: TBD

Fase 2: pruebas generalizadas

Fecha de inicio: no especificada

  1. 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.
  2. La comunidad de complementos y otros miembros deben recibir asistencia relacionada con la transición a Python 3.

Finalización estimada de ambas fases: 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.
    7. 26 de marzo de 2019: liberada la versión estable de NVDA 2019.1.
    8. 26 de abril de 2019: creación de versión de desarrollo (Threshold) construida para alojar la transición a Python 3 y otros cambios incompatibles con versiones anteriores.
    9. 7 de junio de 2019: la corrección para la palabra clave async se ha mezclado en la rama Threshold.
  2. Fase 1 de la transición (en progreso):
    1. 7 de junio de 2019: se ha activado una rama temporal con la transición a Python 3 con diversos cambios en el código fuente.
    2. 8 de junio de 2019: comienzan las compilaciones desde la rama transitoria.
    3. 12 de junio de 2019: ya es posible compilar desde el código fuente.
    4. 13 de junio de 2019: parte de la compilación binaria y el marco de trabajo de pruebas tienen éxito.
  3. Fase 2 de la transición: aún no ha empezado.
  4. Después de la transición: todavía no ha empezado.
  5. 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,