31.13. pickletools — pickle 開発者のためのツール群

ソースコード: Lib/pickletools.py


このモジュールには、 pickle モジュールの詳細に関わる様々な定数や実装に関する長大なコメント、そして pickle 化されたデータを解析する上で有用な関数をいくつか定義しています。このモジュールの内容は pickle の実装に関わっている Python コア開発者にとって有用なものです; 普通の pickle 利用者にとっては、 pickletools モジュールはおそらく関係ないものでしょう。

31.13.1. コマンドラインの使い方

バージョン 3.2 で追加.

コマンドラインから実行するとき、 python -m pickletools は 1 つもしくは複数の pickle ファイルの内容を逆アセンブルします。 pickle 形式の詳細ではなく pickle に保存された Python オブジェクトを見たい場合は、そのコマンドではなく -m pickle を使いたいと思うかもしれません。 しかし、調べたい pickle ファイルが信頼できないソースから来たものであるとき、 -m pickletools は pickle のバイトコードを実行しないので、より安全な選択肢です。

例えば、 x.pickle ファイルに pickle 化されているタプル (1, 2) に対して実行すると次のようになります:

$ python -m pickle x.pickle
(1, 2)

$ python -m pickletools x.pickle
    0: \x80 PROTO      3
    2: K    BININT1    1
    4: K    BININT1    2
    6: \x86 TUPLE2
    7: q    BINPUT     0
    9: .    STOP
highest protocol among opcodes = 2

31.13.1.1. コマンドラインオプション

-a, --annotate

注釈として短い命令コードの説明を各行に表示します。

-o, --output=<file>

出力結果を書き込むファイル名。

-l, --indentlevel=<num>

新しい MARK レベルのインデントに使われる空白の数。

-m, --memo

複数のオブジェクトが逆アセンブルされたとき、逆アセンブリ間でメモを保持します。

-p, --preamble=<preamble>

複数の pickle ファイルが指定されたとき、各逆アセンブリの前に与えられたプリアンブルを表示します。

31.13.2. プログラミングインターフェース

pickletools.dis(pickle, out=None, memo=None, indentlevel=4, annotate=0)

pickle の抽象的な逆アセンブリを file-like オブジェクト out (デフォルトは sys.stdout) に出力します。 pickle は文字列または file-like オブジェクトです。 memo は Python の辞書で、 pickle のメモとして使われます; これは、 pickle 処理を行う 1 つのオブジェクトが、複数の pickle にわたって逆アセンブルを行うために使われます。 ストリーム上の MARK 命令コードが示す後続のレベルは、 indentlevel 個の空白でインデントされます。 annotate に非ゼロの値が与えられた場合、出力される各命令コードは短い命令コードに注釈が付けられます。 annotate の値は、注釈の先頭の位置のヒントとして使われます。

バージョン 3.2 で追加: annotate 引数。

pickletools.genops(pickle)

pickle 内の全ての opcode を取り出すイテレータ(iterator)を返します。このイテレータは (opcode, arg, pos) の三つ組みからなる配列を返します。 opcodeOpcodeInfo クラスのインスタンスのクラスです。 argopcode の引数としてデコードされた Python オブジェクトの値です。 posopcode の場所を表す値です。 pickle は文字列でもファイル類似オブジェクトでもかまいません。

pickletools.optimize(picklestring)

使われていない PUT 命令コードを除去した上で、その新しい pickle 文字列を返します。 最適化された pickle は、長さがより短く、転送時間がより少なく、必要とするストレージ領域がより狭く、 unpickle 化がより効率的になります。