pickletools.md
1> **Источник:** https://python-all.ru/3.3/library/pickletools.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 31.13. [`pickletools`](https://python-all.ru/3.3/library/pickletools.html#module-pickletools) – Инструменты для разработчиков pickle89**Исходный код:** [Lib/pickletools.py](https://python-all.ru/src/3.3/Lib/pickletools.py)1011---1213Этот модуль содержит различные константы, связанные с внутренними деталями модуля [`pickle`](https://python-all.ru/3.3/library/pickle.html#module-pickle), несколько пространных комментариев о реализации и несколько полезных функций для анализа pickled-данных. Содержимое этого модуля полезно для разработчиков ядра Python, работающих над [`pickle`](https://python-all.ru/3.3/library/pickle.html#module-pickle); обычным пользователям модуля [`pickle`](https://python-all.ru/3.3/library/pickle.html#module-pickle) модуль [`pickletools`](https://python-all.ru/3.3/library/pickletools.html#module-pickletools), скорее всего, не понадобится.1415## 31.13.1. Использование командной строки1617Новое в версии 3.2.1819При запуске из командной строки `python -m pickletools` дизассемблирует содержимое одного или нескольких pickle-файлов. Обратите внимание: если нужно увидеть Python-объект, хранящийся в pickle, а не детали формата pickle, лучше использовать `-m pickle`. Однако если pickle-файл, который требуется изучить, получен из ненадёжного источника, `-m pickletools` – более безопасный вариант, так как он не выполняет pickle-байткод.2021Например, для кортежа `(1, 2)`, сериализованного в файл `x.pickle`:2223```python24$ python -m pickle x.pickle25(1, 2)2627$ python -m pickletools x.pickle28 0: \x80 PROTO 329 2: K BININT1 130 4: K BININT1 231 6: \x86 TUPLE232 7: q BINPUT 033 9: . STOP34highest protocol among opcodes = 235```3637### 31.13.1.1. Параметры командной строки3839#### `-a, --annotate`4041Аннотирует каждую строку кратким описанием опкода.4243#### `-o, --output=<file>`4445Имя файла, в который должна быть записана информация.4647#### `-l, --indentlevel=<num>`4849Количество пробелов для отступа нового уровня MARK.5051#### `-m, --memo`5253При дизассемблировании нескольких объектов сохранять memo между сеансами дизассемблирования.5455#### `-p, --preamble=<preamble>`5657Если указано несколько pickle-файлов, выводить указанную преамбулу перед каждым дизассемблированием.5859## 31.13.2. Программный интерфейс6061#### `pickletools.dis(pickle, out=None, memo=None, indentlevel=4, annotate=0)`6263> Выводит символическое дизассемблирование pickle в файлоподобный объект64>65> *out*66>67> , по умолчанию –68>69> `sys.stdout`70>71> .72>73> *pickle*74>75> может быть строкой или файлоподобным объектом.76>77> *memo*78>79> может быть словарём Python, который будет использоваться как мемо pickle; его можно использовать для дизассемблирования нескольких pickle, созданных одним и тем же pickler. Последовательные уровни, обозначаемые опкодами80>81> `MARK`82>83> в потоке, отступают на84>85> *indentlevel*86>87> пробелов. Если88>89> *annotate*90>91> задано ненулевым, каждый опкод в выводе аннотируется кратким описанием. Значение92>93> *annotate*94>95> используется как подсказка для столбца, с которого должна начинаться аннотация.9697Новое в версии 3.2: аргумент *annotate*.9899#### `pickletools.genops(pickle)`100101Предоставляет [*итератор*](https://python-all.ru/3.3/glossary.html#term-iterator) по всем опкодам в pickle, возвращая последовательность троек `(opcode, arg, pos)`. *opcode* – экземпляр класса `OpcodeInfo`; *arg* – декодированное значение аргумента опкода в виде Python-объекта; *pos* – позиция, в которой находится этот опкод. *pickle* может быть строкой или файлоподобным объектом.102103#### `pickletools.optimize(picklestring)`104105Возвращает новую эквивалентную pickle-строку после удаления неиспользуемых опкодов `PUT`. Оптимизированный pickle короче, требует меньше времени на передачу, меньше места для хранения и распаковывается быстрее.106