> **Источник:** https://python-all.ru/3.10/library/pickletools.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# [`pickletools`](https://python-all.ru/3.10/library/pickletools.html#module-pickletools) – утилиты для разработчиков pickle

**Исходный код:** [Lib/pickletools.py](https://python-all.ru/src/3.10/Lib/pickletools.py)

---

Этот модуль содержит различные константы, касающиеся внутренних деталей модуля [`pickle`](https://python-all.ru/3.10/library/pickle.html#module-pickle), несколько пространных комментариев о реализации и несколько полезных функций для анализа данных, сериализованных с помощью pickle. Содержимое этого модуля может быть полезно разработчикам ядра Python, работающим над [`pickle`](https://python-all.ru/3.10/library/pickle.html#module-pickle); обычным пользователям модуля [`pickle`](https://python-all.ru/3.10/library/pickle.html#module-pickle) модуль [`pickletools`](https://python-all.ru/3.10/library/pickletools.html#module-pickletools), скорее всего, не нужен.

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

Новое в версии 3.2.

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

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

```console
$ 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`

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

#### `-p, --preamble=<preamble>`

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

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

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

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

Новое в версии 3.2: аргумент *annotate*.

#### `pickletools.genops(pickle)`

Предоставляет [итератор](https://python-all.ru/3.10/glossary.html#term-iterator) по всем опкодам в pickle, возвращая последовательность троек `(opcode, arg, pos)`. *opcode* – экземпляр класса `OpcodeInfo`; *arg* – это декодированное значение (как объект Python) аргумента опкода; *pos* – позиция, на которой находится этот опкод. *pickle* может быть строкой или файлоподобным объектом.

#### `pickletools.optimize(picklestring)`

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