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 モジュールに相当します)
- 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))