Вопрос:

Является ли `pickle.dump (d, f)` эквивалентным `f.write (pickle.dumps (d))`?

python pickle

23 просмотра

3 ответа

7144 Репутация автора

Учитывая произвольно выбираемую структуру данных Python data,

with open('a', 'bw') as f:
    f.write(pickle.dumps(data))

эквивалентно

with open('a', 'bw') as f:
    pickle.dump(data, f)

т.е. могу ли я принять эту эквивалентность при написании кода? Не могли бы вы описать, как вы пришли к такому выводу?

Вариант использования состоит в том, чтобы отделить сериализацию от записи, так как я могу захотеть записать pickle в не дисковое местоположение.

Автор: Jorge Leitão Источник Размещён: 11.08.2019 06:25

Ответы (3)


0 плюса

5896 Репутация автора

Да.

Документация отвалов довольно ясно:

Вернуть засеченное представление объекта в виде объекта байтов вместо записи его в файл.

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

Также, «file» здесь означает что-либо с writeметодом, из документации дампа :

Аргумент файла должен иметь метод write (), который принимает один байтовый аргумент. Таким образом, это может быть файл на диске, открытый для двоичной записи, экземпляр io.BytesIO или любой другой пользовательский объект, соответствующий этому интерфейсу.

Автор: Koterpillar Размещён: 11.08.2019 06:31

1 плюс

10471 Репутация автора

Решение

Да, они эквивалентны. Глядя на исходный код pickle.py:

def _dump(obj, file, protocol=None, *, fix_imports=True):
    _Pickler(file, protocol, fix_imports=fix_imports).dump(obj)

def _dumps(obj, protocol=None, *, fix_imports=True):
    f = io.BytesIO()
    _Pickler(f, protocol, fix_imports=fix_imports).dump(obj)
    res = f.getvalue()
    assert isinstance(res, bytes_types)
    return res

dumpsделает то же самое dump, просто с io.BytesIOобъектом вместо файлового объекта. Он вызывает внутреннее _Pickler().dump()таким же образом и просто возвращает содержимое io.BytesIOобъекта. Поэтому все, что f.write(pickle.dumps(data))нужно сделать - это сначала переслать результат в io.BytesIOобъект, а затем в реальный файл, вместо прямой записи в файл.

Автор: iz_ Размещён: 11.08.2019 06:32

0 плюса

57186 Репутация автора

Они не эквивалентны, если исключение происходит во время травления. f.write(pickle.dumps(data))не будет ничего писать в файл. Принимая во внимание, pickle.dump(data, f)что в конечном итоге с расщепленным или частичным рассолом.

Автор: Dan D. Размещён: 11.08.2019 08:46
Вопросы из категории :
32x32