Как использовать библиотеку укропов для сериализации объектов с полочной библиотекой - PullRequest
0 голосов
/ 22 октября 2018

Я использую библиотеку PyMemoize для кеширования сопрограмм.Я украсил сопрограмму, но когда Python вызывает ее, я получаю:

TypeError: can't pickle coroutine objects

Это происходит потому, что PyMemoize внутренне пытается засолить сопрограмму и сохранить ее в Redis.Для этого он использует shelve.Shelf, который в свою очередь использует pickle.Проблема в том, что по неизвестной причине pickle не поддерживает травление сопрограмм.

Я пытался засолить сопрограммы с помощью dill, и это сработало.Как мне сказать shelve, чтобы использовать dill в качестве бэкэнда сериализации?

Я пытался сделать обезьянку-патч shelve, но она не сработала (не знаю почему):

import shelve
from dill import Pickler, Unpickler
shelve.Pickler = Pickler
shelve.Unpickler = Unpickler

1 Ответ

0 голосов
/ 15 июля 2019

Вы можете сохранять функции с выходами, но не с генераторами.Из документации : "укроп еще не может засолить следующие стандартные типы: фрейм, генератор , traceback."

Этот код работает (версия укропа 0.3.0):

import shelve
from dill import Pickler, Unpickler
shelve.Pickler = Pickler
shelve.Unpickler = Unpickler
d=shelve.open("shelve.dat")
d['1']=Ellipsis
d.close()

Но без укропа мы получим «Ошибка типа: не могу засечь многоточечные объекты»:

import shelve
d=shelve.open("shelve.dat")
d['1']=Ellipsis
d.close()
...