pickletools — Инструменты для pickle разработчиков


Данный модуль содержит различные константы, относящиеся к интимным деталям модуля pickle, несколько пространных комментариев о реализации и несколько полезных функций для анализа обработанных данных. Содержимое данного модуля полезно для разработчиков ядра Python, которые работают над pickle; обычные пользователи модуля pickle, вероятно, не посчитают модуль pickletools актуальным.

Использование командной строки

Добавлено в версии 3.2.

При вызове из командной строки python -m pickletools дизассемблирует содержимое одного или нескольких пикл файлов. Обратите внимание: если вы хотите увидеть хранящийся в пикле Python объект, а не подробности пикл формата, вы можете вместо него использовать -m pickle. Однако, когда проверяемый пикл файл, поступает из ненадежного источника, -m pickletools является более безопасным вариантом, поскольку он не выполняет байт-код pickle.

Например, с кортежем (1, 2), в пикл файле x.pickle:

$ 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

Аннотирует каждую строку кратким описанием кода операции.

-o, --output=<file>

Имя файла, в который должны быть записаны выходные данные.

-l, --indentlevel=<num>

Количество пробелов для отступа нового уровня MARK.

-m, --memo

При дизассемблировании нескольких объектов сохраняйте памятку между дизассемблированием.

-p, --preamble=<preamble>

Если указано более одного pickle файла, выводить данную преамбулу перед каждой дизассемблированием.

Программный интерфейс

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

Выводит символическую дизассемблирование pickle в файлоподобный объект out, по умолчанию sys.stdout. pickle может быть строкой или файловым объектом. memo может быть словарем Python, который будет использоваться в качестве пикл памятки; ее можно использовать для разборки нескольких пиклов, созданных одним и тем же пиклером. Последовательные уровни, обозначаемые кодами операций MARK в потоке, имеют отступ в виде пробелов indentlevel. Если для annotate задано ненулевое значение, каждый код операции в выводе сопровождается кратким описанием. Значение annotate используется как подсказка для столбца, с которого должна начинаться аннотация.

Добавлено в версии 3.2: Аргумент annotate.

pickletools.genops(pickle)

Предоставляет итератор для всех кодов операций в пикле, возвращая последовательность троек (opcode, arg, pos). opcode — экземпляр класса OpcodeInfo; arg — это декодированное значение аргумента кода операции в виде объекта Python; pos — это позиция, в которой находится данный код операции. pickle может быть строкой или файловым объектом.

pickletools.optimize(picklestring)

Возвращает новую эквивалентную строку пикла после исключения неиспользуемых кодов операций PUT. Оптимизированные пикли короче, занимают меньше времени на передачу, требуют меньше места для хранения и более эффективно распаковываются.