Desde el año 2022 la versión de Athento se encuentra en lenguaje Python 3, este cambio busca garantizar la seguridad de la plataforma y permitir a nuestros clientes tener acceso a tecnologías más modernas y disfrutar de nuevas capacidades.
Dudas generales para migración a Python 3
¿Se requieren características especiales de Hardware?
Es necesario disponer de una máquina con Ubuntu Server 20.04. por cada una de las instancias. Por ejemplo, si se cuenta con entorno de QA, UAT y PRO se requerirá una una máquina para QA, una para UAT y una para PRO.
Para mayor información consultar: Requisitos de instalación de Athento
A nivel de arquitectura de los servidores ¿se requieren cambios?
Se requieren nuevas máquinas con Ubuntu Server 20.04 con las mismas características que las anteriores, las antiguas serán dadas de baja tras finalizar la intervención y dejar un tiempo prudencial por si fuera necesario revisar alguna antigua configuración.
¿Se requieren cambios a nivel de base de datos?
Normalmente, se realiza la actualización a PostgreSQL 12, aunque esto se suele realizar antes o después de la actualizacion de Athento a Python 3, para no mezclar ambas actualizaciones.
¿La estructura de balanceo se mantiene?
La infraestructura final tras la migración será la misma, por lo que se mantendrán las configuraciones de balanceo previamente establecidas.
¿Para la migración hay cambios con elasticsearch?
No es necesario realizar cambios en la integración con Elastic Search. Para mayor información consultar: Integración con Elastic Search
Cambios a aplicar al código personalizado para ajustarlo a Python 3
Para realizar el upgrade del código personalizado, hemos resumido en este artículo los cambios más comunes para pasar de Python 2 a Python 3 en Athento SE:
dictionary.has_key()
has_key ya no existe y se puede cambiar por un ‘in’. Ejemplo:
- if isinstance(automation_result, dict) and automation_result.has_key(NuxeoConnector.EXCEPTION_MESSAGE):
+ if isinstance(automation_result, dict) and NuxeoConnector.EXCEPTION_MESSAGE in automation_result:
dictionary.keys()
En python2 devuelve una lista, pero en python3 es un objeto dict_keys. Hay que tomar las siguientes consideraciones:
La clase dict_keys es iterable, y si se usa para recorrer, entonces no hay problemas.
No obstante, si el uso antiguo era el metodo index, hay que convertirlo a lista:
>>> keys = codes.keys()
>>> keys.index('c1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict_keys' object has no attribute 'index'
>>> list(keys).index('c1')
0
El print de python2 es sin paréntesis, pero en python3 debe llevar paréntesis.
Unicode
El tipo unicode ya no existe en python3. El tipo str directamente está codificado en unicode. Hacer cambio a comparar con str, pero mirar bien que el código tenga sentido:
- if isinstance(context_params, str) or isinstance(context_params, unicode):
+ if isinstance(context_params, str) or isinstance(context_params, str): # Borrar el segundo
Exception
Ahora las excepciones obligatoriamente tienen que usar el “as”:
- except Exception, err:
+ except Exception as err:
Map
Los map() en Python2 devolvían una lista. En Python3 esto ya no es así, devuelven un objeto map.
- categories = map(lambda x: x.category, queues)
+ categories = [x.category for x in queues]
Map en Python3:
>>> listado = ['1','2']
>>> map(lambda x: x, listado)
<map object at 0x7f83a3462e50>
items()
El método items() devuelve en python2 una lista de tuplas, mientras que en python3 devuelve un dict_items.
Ejemplos:
- Python2: [('romance', 'yo antes que tú'), ('fantasía', 'harrypotter'), ('ficción', 'divergente')]
- Python3: dict_items([('fantasía', 'harrypotter'), ('ficción', 'divergente'), ('romance', 'yo antes que tú')])
Por ello el cambio que se debe hacer es:
- for key, val in groupase.items():
+ for key, val in list(groupase.items()):
Import StringIO
- from StringIO import StringIO
+ from io import StringIO
str.decode(...)
2to3 no recomienda cambiar cuando se tiene un objeto tipo str y se le hace un decode, pero Python3 falla. Seguramente se deba a que si esa línea se lee desde fichero pueda venir con algún encoding. El cambio propuesto es dejarla comentada.
xrange(...)
En python 3 xrange ya no existe. Por ello, su equivalente es “range”.
- for i in xrange(num_workers):
+ for i in range(num_workers):
open(filename, 'rb')
En Python 2 los ficheros pueden abrirse con open(filename, 'r') pero en Python 3 debe ser con open(filename, 'rb')
Comentarios
0 comentarios
Inicie sesión para dejar un comentario.