Не могу использовать collection.defaultdict () в google-app-engine - PullRequest
0 голосов
/ 13 июня 2018

Попытка использовать collection.defaultdict () для создания гистограммы в google-app-engine:

class myDS(ndb.Model):

    values = ndb.PickleProperty()
    hist = ndb.PickleProperty()

class Handler:
    my_ds = myDS()
    my_ds.values = {}   
    my_ds.hist = defaultdict(lambda : 0) 

И получил ошибку (из журнала)

File "/base/alloc/tmpfs/dynamic_runtimes/python27/277b61042b697c7a_unzipped/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1331, in call
    newvalue = method(self, value)
  File "/base/alloc/tmpfs/dynamic_runtimes/python27/277b61042b697c7a_unzipped/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1862, in _to_base_type
    return pickle.dumps(value, pickle.HIGHEST_PROTOCOL)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

Любым способомчтобы решить это?

1 Ответ

0 голосов
/ 14 июня 2018

Для поля PickleProperty требуется значение, которое сериализуемо с использованием протокола выбора Python (см. документы для получения дополнительной информации):

PickleProperty: значением является объект Python (например,list или dict или string), которые сериализуются с использованием протокола Python pickle;Cloud Datastore хранит сериализацию рассола в виде большого двоичного объекта.Индексируется по умолчанию.Необязательный аргумент ключевого слова: сжатый.

См. Также ответ от Martijn Pieters:

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

Существует несколько опций для работы со значениями по умолчанию, в зависимости от вашего варианта использования.

...