Как проверить, был ли файл создан рассолом?

Есть ли способ проверить, был ли файл создан pickle? Я мог бы просто поймать исключения, сброшенные pickle.load, но не существует конкретного исключения "not pickle file".

Ответы

Ответ 1

У файлов Pickle нет заголовка, поэтому нет стандартного способа идентифицировать их, за исключением попыток снять его и увидеть, возникают ли при этом какие-либо исключения.

Вы можете определить свой собственный расширенный протокол, который включает в себя какой-то заголовок, создав подклассы классов Pickler() и Unpickler() в модуле pickle. Однако это невозможно сделать с помощью гораздо более быстрого модуля cPickle, поскольку эти две функции являются заводскими функциями, которые нельзя разделить на подклассы [1].

Более гибкий подход будет определять ваши собственные независимые классы, которые использовали соответствующие экземпляры Pickler() и Unpickler() из любого из этих модулей в своей реализации.

Обновление

Последним байтом всех файлов pickle должен быть код операции pickle.STOP, поэтому, хотя заголовка нет, - это фактически очень минимальный трейлер, который было бы относительно просто проверить.

В зависимости от вашего точного использования вы можете избежать добавления к нему чего-то более сложного (и длиннее одного байта), поскольку любые данные после кода операции STOP в представлении засоленных объектов игнорируются [2].

[1] Сноска [2] в документации по Python 2.
[2] Документация для pickle.loads(), которая также применяется к pickle.load(), поскольку в настоящее время она применяется в терминах первого.

Ответ 2

Нет никакого верного способа, кроме как попытаться его разблокировать и поймать исключения.