Я пытаюсь протравить и unpickle структурированных данных в собственность ndb.PickleProperty() как так:Травления на GAE ОПРС
month = MonthRecord.get_or_insert(month_yr_str, parent=ndb.Key('Type','Grocery'), record=pickle.dumps(defaultdict(list_list)))
names_dict = pickle.loads(month.record) # unpickle for updating
# ... # some modifications on names_dict
month.record = pickle.dumps(names_dict) # pickle
month.put() # commit changes
где модель MonthRecord определяются как:
class MonthRecord(ndb.Model):
record = ndb.PickleProperty() # {name: [[date&time],[expenses]]}
и list_list как:
def list_list(): # placeholder function needed by pickle at module level
return [[],[]]
Первый запуск работает нормально (где вставка случай попадания в get_or_insert, создавая новый MonthRe шнур). Тем не менее, в течение последующих опытов (т.е. новых расходов в течение текущего месяца для записи) возникает следующая ошибка:
Traceback (most recent call last):
File "C:\GAE_Projects\qb_lite\fin.py", line 31, in update_db
names_dict = pickle.loads(month.record)
File "C:\Python27\lib\pickle.py", line 1382, in loads
return Unpickler(file).load()
File "C:\Python27\lib\pickle.py", line 858, in load
dispatch[key](self)
File "C:\Python27\lib\pickle.py", line 1133, in load_reduce
value = func(*args)
TypeError: __init__() takes exactly 4 arguments (1 given)
Любые идеи, как на причину ошибки?
Проверено, есть ли дополнительное/избыточное травление или нет, код работает. Реальная причина проблемы заключается в том, что объекты datetime с tzinfo, которые не могут быть правильно рассорены, поскольку TimeZone не определен на уровне модуля. Исправлено удаление tzinfo в объектах datetime. Причина корня была обнаружена, когда я удалил лишний слой травления. Теперь используйте PickleProperty правильно. Благодарю. – silvernightstar