Diferenças de Python 2 e Python 3

Este tópico discute a diferença entre o Python 2 e 3 como ele se aplica ao aplicativo Orchestration & Automation .

As diferenças que existem entre o Python 2 e o Python 3 são cobertas em detalhes na documentação do Python. Por exemplo, veja O que há de Novo em Python 3.0. Além disso, é preciso estar ciente das diferenças que se aplicam no contexto de Orquestração & Automação.

Importando módulos

O recurso de scripts permite importar módulos Python ao escrever um script. Se o campo Idioma for configurado como Python 2, será possível importar somente os módulos java.util.Date e re. Se configurado como Python 3, será possível importar os módulos a seguir:
  • array
  • base64
  • bs4
  • calendar
  • collections
  • datetime (equivalente ao módulo Python 2 java.util.Date)
  • email
  • enum
  • hashlib
  • html
  • html2text
  • json
  • random
  • re
  • regex
  • sequência
  • horário
  • xml
Além disso, as integrações Python a seguir estão disponíveis somente para scripts Python 3:
  • todos ()
  • any()
  • bytearray()
  • bytes()
  • classmethod
  • staticmethod
  • type()

Tipos de Erros

A implementação do Python 3 introduz dois novos tipos de erro:
  • ResilientSecurityException ocorrerá se um script tentar violar as restrições de segurança.
  • ResilientMemoryLimitException ocorrerá se o script tentar alocar mais do que a quantia máxima de RAM permitida (64 MB).

Palavra-chave 'from'

A palavra-chave from no Python 3 entra em conflito com o atributo from no objeto de contexto da mensagem de e-mail. Por esse motivo, o uso de emailmessage.from não é suportado em scripts Python 3 e deve ser substituído por emailmessage.sender. O Python 2 ainda suporta emailmessage.from.

Campos não existentes

No Python 2, a tentativa de acessar um atributo do objeto de contexto que não existe é bem-sucedida e retorna None. No entanto, no Python 3, a mesma operação lança um erro de atributo, que afirma que o nome do campo é inválido. Esse comportamento está em linha com o Python 3 padrão. O método hasattr() pode ser usado para verificar se um atributo existe. Por exemplo:
if hasattr(incident, 'nonExistentField'):
  log.info(incident.nonExistentField)
else:
  log.info('Tried to access a field that does not exist')
O script retorna a mensagem de log a seguir:
INFO: Cannot access a field that does not exist.

Suporte a Unicode

O Python 3 suporta o Unicode pronto para uso. Isso significa que não é mais necessário usar explicitamente o prefixo u ou a função unicode() para armazenar uma sequência como Unicode. Se você converter scripts existentes do Python 2 em Python 3, deverá verificar e remover esses elementos para evitar erros relacionados ao Unicode em Python 3. Para obter mais informações, consulte a documentação do Python 3 https://docs.python.org/3.6/howto/unicode.html.

Tipo de dados do objeto de texto

Os tipos de dados de objeto de texto se comportam de forma diferente em Python 2 e Python 3. Essas diferenças não necessariamente quebram scripts que são convertidos do Python 2 em 3, mas podem ser de interesse.
  • No Python 3, se você configurar o valor de um campo de área de texto usando uma sequência simples ou uma função auxiliar, o valor será armazenado como um TextObject. No Python 2, se você configurar o valor de um campo de área de texto usando uma sequência simples, o valor será armazenado como um objeto Unicode. Se você configurá-lo usando uma função auxiliar, o valor será armazenado como um SimpleTextContentDTO.
  • No Python 3, o formato padrão para objetos do tipo TextObject é 'html'. O formato é configurado como 'text' apenas se o valor de campo for configurado chamando helper.createPlainText(). No Python 2, o formato para objetos do tipo SimpleTextContentDTO pode ser TEXT ou HTML, dependendo do auxiliar que é chamado para configurar o valor.
É possível explorar as diferenças nas versões Python executando o script a seguir e verificando as mensagens de log:
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))