尝试使用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
有什么方法可以解决这个问题吗?
答案 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;要导入的函数 并在再次打开时引用。
根据您的使用情况,有多种选项可以使用默认值。