Diferencias entre Python 2 y Python 3

En este tema se describe la diferencia entre Python 2 y 3, ya que se aplica a la aplicación Orchestration & Automation .

Las diferencias entre Python 2 y Python3 se describen detalladamente en la documentación de Python. Por ejemplo, consulte Novedades en Python 3.0. Además, debe tener en cuenta las diferencias que se aplican en el contexto de Orchestration & Automation.

Importación de módulos

La característica de scripts le permite importar módulos de Python cuando escribe un script. Si el campo Lenguaje está establecido en Python 2, solo puede importar los módulos java.util.Date y re. Si está establecido en Python 3, puede importar los siguientes módulos:
  • array
  • base64
  • bs4
  • calendar
  • collections
  • datetime (equivalent to the Python 2 java.util.Date module)
  • correo electrónico
  • enum
  • hashlib
  • html
  • html2text
  • json
  • random
  • re
  • regex
  • serie
  • Hora
  • xml
Además, los siguientes elementos incorporados de Python solo están disponibles para scripts de Python 3:
  • all ()
  • any()
  • bytearray()
  • bytes()
  • classmethod
  • staticmethod
  • tipo ()

Tipos de errores

La implementación de Python 3 incorpora dos nuevos tipos de error:
  • Se produce una ResilientSecurityException si un script intenta infringir las restricciones de seguridad.
  • Se produce una ResilientMemoryLimitException si el script intenta asignar más de la cantidad máxima de RAM permitida (64 MB).

Palabra clave 'from'

La palabra clave from en Python 3 entra en conflicto con el atributo from del objeto de contexto de mensaje de correo electrónico. Este es el motivo por lo que no se admite el uso de emailmessage.from en scripts de Python 3 y se debe sustituir por emailmessage.sender. Python 2 sigue admitiendo emailmessage.from.

Campos que no existen

En Python 2, si se intenta acceder a un atributo de objeto de contexto que no existe, la operación se realiza correctamente y devuelve None. Sin embargo, en Python 3 la misma operación genera un error de atributo que indica que el nombre del campo no es válido. Este comportamiento está en línea con Python 3 estándar. El método hasattr() se puede utilizar para comprobar si existe un atributo. Por ejemplo:
if hasattr(incident, 'nonExistentField'):
  log.info(incident.nonExistentField)
else:
  log.info('Tried to access a field that does not exist')
El script devuelve el siguiente mensaje de registro:
INFO: Cannot access a field that does not exist.

Soporte de Unicode

Python 3 da soporte a unicode de forma automática. Esto significa que ya no tiene que utilizar de forma explícita el prefijo u o la función unicode() para guardar una serie como unicode. Si convierte los scripts existentes de Python 2 a Python 3, debe comprobar y eliminar estos elementos para evitar errores relacionados con Unicode en Python 3. Para obtener más información, consulte la documentación de Python 3 https://docs.python.org/3.6/howto/unicode.html.

Tipo de datos de objeto de texto

Los tipos de datos de objeto de texto se comportan de forma diferente en Python 2 y Python 3. Estas diferencias no interrumpen necesariamente los scripts que se convierten de Python 2 a 3, pero es interesante conocerlas.
  • En Python 3, tanto si establece el valor de un campo de área de texto con una serie simple o con una función del ayudante, el valor se guarda como un TextObject. En Python 2, si establece el valor de un campo de área de texto con una serie simple, el valor se guarda como un objeto unicode. Si lo establece mediante una función de ayudante, el valor se guarda como SimpleTextContentDTO.
  • En Python 3, el formato predeterminado para objetos de tipo TextObject es ‘html’. El formato solo se establece en 'text' si el valor de campo se establece invocando helper.createPlainText(). En Python 2, el formato para los objetos de tipo SimpleTextContentDTO puede ser TEXT o HTML, en función del ayudante que se invoque para establecer el valor.
Para ver las diferencias entre las versiones de Python, ejecute el siguiente script y consulte los mensajes de registro:
incident.description = 'set direct'
log.info(type(incident.description)) 

incident.description = helper.createPlainText('set using createPlainText helper') 
log.info(type(incident.description)) 

incident.description = helper.createRichText('set using createRichText helper') 
log.info(type(incident.description))