marshal --- 内部使用向けの Python オブジェクト直列化¶
このモジュールは、Python の値をバイナリ形式で読み書きする関数を提供します。 この形式は Python 固有ですが、マシンのアーキテクチャには依存しません (例えば PC で Python の値をファイルに書き込み、そのファイルを Mac に転送して読み戻せます)。 形式の詳細は意図的に文書化されていません。 Python のバージョンによって変更される場合があります (ただし、実際にはまれです)。 [1]
これは汎用の「永続化」モジュールではありません。
Python オブジェクトの汎用的な永続化や RPC 呼び出しによる転送には、pickle と shelve を参照してください。
marshal モジュールは主に、Python モジュールの「擬似コンパイル済み」コードを .pyc ファイルで読み書きするために存在します。
そのため、Python のメンテナーは、必要に応じて後方互換性のない形で marshal 形式を変更する権利を留保します。
形式のバージョンが同じでも、コードオブジェクトの形式は Python のバージョン間で互換性がありません。
誤った Python バージョンでコードオブジェクトを復元した場合の動作は未定義です。
Python オブジェクトを直列化したり復元したりするには、代わりに pickle モジュールを使ってください。
性能は同程度で、バージョンに依存しないことが保証され、marshal よりはるかに幅広いオブジェクトをサポートします。
警告
marshal モジュールは、誤ったデータや悪意を持って作成されたデータに対して安全であるようには設計されていません。
信頼できない、または認証されていない送信元から受け取ったデータを決して復元しないでください。
bytes-like オブジェクトを操作する関数と同様に、ファイルの読み書きを行う関数が提供されています。
すべての Python オブジェクト型をサポートしているわけではありません。 一般に、このモジュールで読み書きできるのは、値が Python の特定の実行に依存しないオブジェクトだけです。 以下の型をサポートします。
文字列 (
str) とbytes。bytearrayのような bytes-like object は、bytesとして直列化されます。コンテナ:
tuple、list、dict、frozendict(version6 以降)、set、frozenset、slice(version5 以降)。 これらは、格納する値もサポートされている場合にのみサポートされます。 再帰的なコンテナはversion3 以降でサポートされています。シングルトンの
None、Ellipsis、StopIteration。allow_code が真の場合の
codeオブジェクト。 バージョンへの依存については、上の注意書きを参照してください。
バージョン 3.4 で変更:
再帰的なリスト、集合、辞書の直列化をサポートする形式バージョン 3 を追加しました。
短い文字列を効率的に表現する形式バージョン 4 を追加しました。
バージョン 3.14 で変更: スライスの直列化を可能にする形式バージョン 5 を追加しました。
バージョン 3.15 で変更: frozendict の直列化を可能にする形式バージョン 6 を追加しました。
このモジュールでは、以下の関数が定義されています。
- marshal.dump(value, file, version=version, /, *, allow_code=True)¶
開かれたファイルに値を書き込みます。値はサポートされている型でなくてはなりません。file は書き込み可能な バイナリファイル である必要があります。
値がサポートされていない型であるか、その型のオブジェクトを含む場合、
ValueErrorを送出しますが、不正なデータもファイルに書き込まれます。 このオブジェクトはload()で正しく読み戻せません。 コードオブジェクト は allow_code が真の場合にのみサポートされます。version 引数は
dumpが使用するデータフォーマットを指定します (下記を参照してください)。引数
value,versionを指定して 監査イベントmarshal.dumpsを送出します。バージョン 3.13 で変更: allow_code 引数を追加しました。
- marshal.load(file, /, *, allow_code=True)¶
開かれたファイルから値を 1 つ読み取り、返します。 有効な値を読み取れない場合 (例えば、別の Python バージョンの互換性のない marshal 形式である場合)、
EOFError、ValueError、TypeErrorのいずれかを送出します。 コードオブジェクト は allow_code が真の場合にのみサポートされます。 ファイルは読み取り可能な バイナリファイル でなければなりません。引数無しで 監査イベント
marshal.loadを送出します。バージョン 3.10 で変更: 以前はコードオブジェクトごとに
code.__new__監査イベントを発生させていました。 現在は読み込み操作全体に対してmarshal.loadイベントを 1 回発生させます。バージョン 3.13 で変更: allow_code 引数を追加しました。
- marshal.dumps(value, version=version, /, *, allow_code=True)¶
dump(value, file)でファイルに書き込まれる内容を bytes オブジェクトとして返します。 値はサポートされている型でなければなりません。 値がサポートされていない型であるか、その型のオブジェクトを含む場合、ValueErrorを送出します。 コードオブジェクト は allow_code が真の場合にのみサポートされます。version 引数は
dumpsが使用するデータフォーマットを指定します (下記を参照してください)。引数
value,versionを指定して 監査イベントmarshal.dumpsを送出します。バージョン 3.13 で変更: allow_code 引数を追加しました。
- marshal.loads(bytes, /, *, allow_code=True)¶
bytes-like object を値に変換します。 有効な値が見つからなければ、
EOFError、ValueError、TypeErrorのいずれかを送出します。 コードオブジェクト は allow_code が真の場合にのみサポートされます。 入力の余分なバイトは無視されます。引数
bytesを指定して 監査イベントmarshal.loadsを送出します。バージョン 3.10 で変更: 以前はコードオブジェクトごとに
code.__new__監査イベントを発生させていました。 現在は読み込み操作全体に対してmarshal.loadsイベントを 1 回発生させます。バージョン 3.13 で変更: allow_code 引数を追加しました。
これに加えて、以下の定数が定義されています:
- marshal.version¶
モジュールが使う形式を示します。 バージョン 0 が最初のバージョンで、以降のバージョンでは新しい機能が追加されています。 通常、新しいバージョンは導入と同時にデフォルトになります。
Version
利用可能になったバージョン
新しい機能
1
Python 2.4
インターン化された文字列の共有
2
Python 2.5
浮動小数点数のバイナリ表現
3
Python 3.4
オブジェクトの共有と再帰のサポート
4
Python 3.4
短い文字列の効率的な表現
5
Python 3.14
sliceオブジェクトのサポート6
Python 3.15
frozendictオブジェクトのサポート
脚注