Python 2 と Python 3 の違い

このトピックでは、 オーケストレーション & 自動化 アプリケーションに適用される Python 2 と 3 の違いについて説明します。

Python 2 と Python 3 の違いについては、Python の資料で詳しく説明されています。 例えば、 What 's New in Python 3.0を参照してください。 さらに、 「オーケストレーション」&「自動化」のコンテキストに適用される相違点にも注意する必要があります。

モジュールのインポート

スクリプト機能を使用すると、スクリプトの作成時に Python モジュールをインポートできます。 「言語」フィールドが Python 2 に設定されている場合は、java.util.Date モジュールと re モジュールのみをインポートできます。 Python 3 に設定されている場合は、以下のモジュールをインポートできます。
  • array
  • base64
  • bs4
  • calendar
  • collections
  • datetime (Python 2 の java.util.Date モジュールに相当します)
  • email
  • enum
  • hashlib
  • html
  • html2text
  • json
  • random
  • re
  • regex
  • ストリング
  • 時間
  • xml
さらに、以下の Python 組み込み関数は Python 3 スクリプトでのみ使用できます。
  • すべて ()
  • any()
  • bytearray()
  • bytes()
  • classmethod
  • staticmethod
  • type ()

エラーのタイプ

Python 3 の実装では、2 つの新しいエラー・タイプが導入されています。
  • ResilientSecurityException は、スクリプトがセキュリティー制限を侵害しようとした場合に発生します。
  • ResilientMemoryLimitException は、スクリプトが許可されている最大量 (64MB) を超える RAM を割り振ろうとした場合に発生します。

「from」キーワード

Python 3 の from キーワードは、E メール・メッセージ・コンテキスト・オブジェクト内の from 属性と競合します。 このため、Python 3 スクリプトでは emailmessage.from の使用はサポートされておらず、emailmessage.sender に置き換える必要があります。 Python 2 では、引き続き emailmessage.from をサポートします。

存在しないフィールド

Python 2 では、まだ存在していないコンテキスト・オブジェクト属性にアクセスしようとすると、アクセスが成功して None が返されます。 しかし、Python 3 で同じ操作を行うと、フィールド名が無効であることを示す属性エラーがスローされます。 この動作は、標準の Python 3に沿っています。 hasattr() メソッドを使用して、属性が存在するかどうかを確認できます。 例:
if hasattr(incident, 'nonExistentField'):
  log.info(incident.nonExistentField)
else:
  log.info('Tried to access a field that does not exist')
スクリプトは、次のログ・メッセージを返します。
INFO: Cannot access a field that does not exist.

ユニコードのサポート

Python 3 は、標準でユニコードをサポートしています。 これは、ストリングをユニコードとして保管する際に、明示的に u プレフィックスや unicode() 関数を使用する必要がなくなったことを意味します。 既存のスクリプトを Python 2 から Python 3に変換する場合は、これらのエレメントを検査して削除し、Python 3での Unicode 関連のエラーを回避する必要があります。 詳しくは、Python 3 の資料 https://docs.python.org/3.6/howto/unicode.html を参照してください。

テキスト・オブジェクト・データ・タイプ

テキスト・オブジェクト・データ・タイプの動作は、Python 2 と Python 3 で異なります これらの違いは、必ずしも Python 2 から 3 に変換されたスクリプトを壊してしまうものではありませんが、注意しておくべきものです。
  • Python 3 では、テキスト・エリア・フィールドの値の設定に単純ストリングを使用するかヘルパー関数を使用するかに関係なく、値はテキスト・オブジェクトとして保管されます。 Python 2 では、単純ストリングを使用してテキスト・エリア・フィールドの値を設定した場合、値はユニコード・オブジェクトとして保管されます。 ヘルパー関数を使用して設定した場合、値は SimpleTextContentDTO として保管されます。
  • Python 3 では、TextObject タイプのオブジェクトの場合、デフォルトの形式は「html」です。 この形式は、フィールド値が helper.createPlainText() を呼び出すことによって設定される場合にのみ「text」に設定されます。 Python 2では、SimpleTextContentDTO 型のオブジェクトのフォーマットは、値を設定するために呼び出されるヘルパーに応じて、テキスト型または HTML型になる場合があります。
以下のスクリプトを実行してログ・メッセージを確認することにより、Python バージョンの違いを調べることができます。
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))