Unterschiede zwischen Python 2 und Python 3

In diesem Abschnitt wird der Unterschied zwischen Python 2 und 3 in Bezug auf die Anwendung Orchestration & Automation erläutert.

Die Unterschiede, die zwischen Python 2 und Python 3 bestehen, werden in der Python-Dokumentation ausführlich behandelt. Ein Beispiel finden Sie unter Neuerungen in Python 3.0. Darüber hinaus müssen Sie Unterschiede beachten, die im Kontext von Orchestration & Automationgelten.

Module importieren

Die Scriptfunktion ermöglicht es Ihnen, Python-Module zu importieren, wenn Sie ein Script schreiben. Wenn das Feld Language (Sprache) auf Python 2 eingestellt ist, können Sie nur die Module java.util.Date und re importieren. Wenn es auf Python 3 eingestellt ist, können Sie die folgenden Module importieren:
  • array
  • base64
  • bs4
  • calendar
  • collections
  • datetime (entspricht dem Python-2-Modul java.util.Date)
  • E-Mail
  • enum
  • hashlib
  • html
  • html2text
  • json
  • random
  • re
  • regex
  • Zeichenfolge
  • Zeit
  • xml
Darüber hinaus sind die folgenden Python-Integrationen nur für Python 3-Scripts verfügbar:
  • alle ()
  • any()
  • bytearray()
  • bytes()
  • classmethod
  • staticmethod
  • Typ ()

Fehlertypen

Die Python 3-Implementierung führt zwei neue Fehlertypen ein:
  • ResilientSecurityException tritt auf, wenn ein Script versucht, die Sicherheitseinschränkungen zu umgehen.
  • ResilientMemoryLimitException tritt auf, wenn das Script versucht, mehr als den maximal zulässigen Arbeitsspeicher (64 MB) zuzuweisen.

Schlüsselwort 'from'

Das from-Schlüsselwort in Python 3 kollidiert mit dem from-Attribut im Kontextobjekt der E-Mail-Nachricht. Aus diesem Grund wird die Verwendung von emailmessage.from in Python 3-Scripts nicht unterstützt und sollte durch emailmessage.sender ersetzt werden. Python 2 unterstützt nach wie vor emailmessage.from.

Nicht existierende Felder

In Python 2 ist der Versuch, auf ein nicht vorhandenes Attribut des Kontextobjekts zuzugreifen, erfolgreich und gibt None (Keines) zurück. In Python 3 löst die gleiche Operation jedoch einen Attributfehler aus, der besagt, dass der Feldname ungültig ist. Dieses Verhalten entspricht dem Standard Python 3. Mit der Methode hasattr() kann überprüft werden, ob ein Attribut vorhanden ist. Beispiel:
if hasattr(incident, 'nonExistentField'):
  log.info(incident.nonExistentField)
else:
  log.info('Tried to access a field that does not exist')
Das Script gibt die folgende Protokollnachricht zurück:
INFO: Cannot access a field that does not exist.

Unicode-Unterstützung

Python 3 unterstützt Unicode ohne Vorbereitungs- oder Anpassungsaufwand. Das bedeutet, dass Sie nicht mehr explizit das Präfix u oder die Funktion unicode() verwenden müssen, um eine Zeichenkette als Unicode zu speichern. Wenn Sie vorhandene Scripts von Python 2 in Python 3 konvertieren, müssen Sie diese Elemente überprüfen und entfernen, um unicodebezogene Fehler in Python 3 zu vermeiden. Weitere Informationen finden Sie in der Python 3-Dokumentation https://docs.python.org/3.6/howto/unicode.html.

Textobjekt-Datentyp

Textobjektdatentypen verhalten sich in Python 2 und Python 3 unterschiedlich. Diese Unterschiede brechen nicht notwendigerweise Scripts aus, die von Python 2 auf 3 konvertiert werden, aber möglicherweise von Interesse sind.
  • Unabhängig davon, ob Sie in Python 3 den Wert eines Textfelds mit einer einfachen Zeichenkette oder einer Hilfsfunktion setzen, wird der Wert als TextObjekt gespeichert. Wenn Sie in Python 2 den Wert eines Textfeldes mit einer einfachen Zeichenfolge setzen, wird der Wert als Unicode-Objekt gespeichert. Wenn Sie ihn über eine Hilfsfunktion setzen, wird der Wert als SimpleTextContentDTO gespeichert.
  • In Python 3 ist das Standardformat für Objekte vom Typ TextObject 'html'. Das Format wird nur dann auf 'text' gesetzt, wenn der Feldwert durch den Aufruf von helper.createPlainText ()festgelegt wird. In Python 2 kann das Format für Objekte des Typs 'SimpleTextContentDTO' TEXT oder HTML sein, abhängig von dem Helper, der zum Festlegen des Werts aufgerufen wird.
Sie können die Unterschiede in den Python-Versionen untersuchen, indem Sie das folgende Script ausführen und die Protokollnachrichten überprüfen:
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))