pickletools
--- pickle 開(kāi)發(fā)者工具集?
源代碼: Lib/pickletools.py
此模塊包含與 pickle
模塊內部細節有關(guān)的多個(gè)常量,一些關(guān)于具體實(shí)現的詳細注釋?zhuān)约耙恍┠軌蚍治龇獯鏀祿挠杏煤瘮怠?此模塊的內容對需要操作 pickle
的 Python 核心開(kāi)發(fā)者來(lái)說(shuō)很有用處;pickle
的一般用戶(hù)則可能會(huì )感覺(jué) pickletools
模塊與他們無(wú)關(guān)。
命令行語(yǔ)法?
3.2 新版功能.
當從命令行發(fā)起調用時(shí),python -m pickletools
將對一個(gè)或更多 pickle 文件的內容進(jìn)行拆解。 請注意如果你查看 pickle 中保存的 Python 對象而非 pickle 格式的細節,你可能需要改用 -m pickle
。 但是,當你想檢查的 pickle 文件來(lái)自某個(gè)不受信任的源時(shí),-m pickletools
是更安全的選擇,因為它不會(huì )執行 pickle 字節碼。
例如,對于一個(gè)封存在文件 x.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
命令行選項?
- -a, --annotate?
使用簡(jiǎn)短的操作碼描述來(lái)標注每一行。
- -o, --output=<file>?
輸出應當寫(xiě)入到的文件名稱(chēng)。
- -l, --indentlevel=<num>?
一個(gè)新的 MARK 層級所需縮進(jìn)的空格數。
- -m, --memo?
當反匯編多個(gè)對象時(shí),保留各個(gè)反匯編的備忘記錄。
- -p, --preamble=<preamble>?
當指定一個(gè)以上的 pickle 文件時(shí),在每次反匯編之前打印給定的前言。
編程接口?
- pickletools.dis(pickle, out=None, memo=None, indentlevel=4, annotate=0)?
將 pickle 的符號化反匯編數據輸出到文件類(lèi)對象 out,默認為
sys.stdout
。 pickle 可以是一個(gè)字符串或一個(gè)文件類(lèi)對象。 memo 可以是一個(gè)將被用作 pickle 的備忘記錄的 Python 字典;它可被用來(lái)對由同一封存器創(chuàng )建的多個(gè)封存對象執行反匯編。 由MARK
操作碼指明的每個(gè)連續級別將會(huì )縮進(jìn) indentlevel 個(gè)空格。 如果為 annotate 指定了一個(gè)非零值,則輸出中的每個(gè)操作碼將以一個(gè)簡(jiǎn)短描述來(lái)標注。 annotate 的值會(huì )被用作標注所應開(kāi)始的列的提示。3.2 新版功能: annotate 參數。
- pickletools.genops(pickle)?
提供包含 pickle 中所有操作碼的 iterator,返回一個(gè)
(opcode, arg, pos)
三元組的序列。 opcode 是OpcodeInfo
類(lèi)的一個(gè)實(shí)例;arg 是 Python 對象形式的 opcode 參數的已解碼值;pos 是 opcode 所在的位置。 pickle 可以是一個(gè)字符串或一個(gè)文件類(lèi)對象。
- pickletools.optimize(picklestring)?
在消除未使用的
PUT
操作碼之后返回一個(gè)新的等效 pickle 字符串。 優(yōu)化后的 pickle 將更為簡(jiǎn)短,耗費更為的傳輸時(shí)間,要求更少的存儲空間并能更高效地解封。