无法在google-app-engine中使用collections.defaultdict()

时间:2018-06-13 14:42:31

标签: python-3.x google-app-engine app-engine-ndb google-app-engine-python defaultdict

尝试使用collections.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 :(得分:2)

PickleProperty字段需要一个可使用Python的pickle协议进行序列化的值(有关详细信息,请参阅docs):

  

PickleProperty:Value是一个Python对象(例如列表或dict或a   字符串)可以使用Python的pickle协议进行序列化;云   数据存储区将pickle序列化存储为blob。没有索引   默认。可选关键字参数:compressed。

另见Martijn Pieters的answer

  

Pickle无法处理lambdas; pickle只处理数据,而不是代码,   和lambdas包含代码。功能可以腌制,但就像   只有在可以导入函数时才定义类定义。一个功能   可以导入在模块级别定义的。 Pickle只是存储一个   在这种情况下,字符串,完整的路径&#39;要导入的函数   并在再次打开时引用。

根据您的使用情况,有多种选项可以使用默认值。